将2d数组转换为Java列表

时间:2013-04-25 04:45:06

标签: java list data-structures multidimensional-array

所以,这可能是一个简单的问题,但我无法找到任何简单或优雅的方法来做到这一点。在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]));
}

我想要更好的东西,并且可能比这更快。

3 个答案:

答案 0 :(得分:1)

唯一更快的方法就是拥有一个更加美好的视角;你可以用Guava这样做:

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[][]。)

答案 1 :(得分:0)

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());

答案 2 :(得分:0)

作为 Java8,您需要Arrays.stream(array).map(Arrays::asList).collect(Collectors.toList())