1

所以,这可能是一个简单的问题,但我找不到任何简单或优雅的方法来做到这一点。在 Java 中将数组转换为列表是微不足道的

Double[] old = new Double[size];
List<Double> cast = Arrays.asList(old);

但我目前正在处理图像,我希望能够将此功能扩展到二维数组,而不必遍历附加到列表的数组的一维。

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]));
}

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

4

3 回答 3

2

要做到这一点,唯一更快的方法是用更漂亮的视图。你可以像这样用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[][]而不是 boxed Double[][]。)

于 2013-04-25T05:03:20.607 回答
2

就像 Java8 一样Arrays.stream(array).map(Arrays::asList).collect(Collectors.toList())

于 2021-05-20T02:10:30.700 回答
0

之后JAVA 8 stream APIs我们可以以更快、更简洁的方式从二维数组中获取列表列表。

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());
于 2019-09-11T18:18:51.077 回答