所以,这可能是一个简单的问题,但我找不到任何简单或优雅的方法来做这件事。在Java 中,将数组转换为列表是微不足道的
Double[] old = new Double[size];
List<Double> cast = Arrays.asList(old);
但我目前正在处理图像,我希望能够将此功能扩展到2d数组,而不必迭代数组的一个维度并附加到列表中。
Double[][] -> List<List<Double>>
这基本上是我想要实现的。我有一个大致如下的解决方案:
Double[][] old= new Double[width][height];
List<List<Double>> new= new ArrayList<List<Double>>();
for (int i=0;i<old.length();i++){
new.add(Arrays.asList(old[i]));
}
我想要比这更好、可能更快的东西。
唯一更快的方法是使用更高级的视图;你可以用番石榴这样做:
Double[][] array;
List<List<Double>> list = Lists.transform(Arrays.asList(array),
new Function<Double[], List<Double>>() {
@Override public List<Double> apply(Double[] row) {
return Arrays.asList(row);
}
}
}
这会在恒定时间内返回一个视图。
除此之外,您已经有了最佳解决方案。
(FWIW,如果你最终使用了Guava,你可以使用Doubles.asList(double[])
,这样你就可以使用基元double[][]
而不是盒装的Double[][]
。(
作为Java8,您可以执行Arrays.stream(array).map(Arrays::asList).collect(Collectors.toList())
。
JAVA 8 stream APIs
之后,我们可以以更快、更干净的方式从2d数组中获取列表列表。
Double[][] old= new Double[width][height];
List<List<Double>> listOfLists = Arrays.stream(Objects.requireNonNull(old)).map(row -> {
return Arrays.asList((row != null) ? row : new Double[0]);
}).collect(Collectors.toList());
将矩阵视为您的2d数组,然后是
List<List<Integer>> resList = new ArrayList<>();
for(int[] rows : matrix) {
resList.add(Arrays.stream(rows).boxed().collect(Collectors.toList()));
}