用零填充一个二维ArrayList

5

我知道可以使用以下语句将普通向量/列表中的某些元素填充为 0

double[][] list = new double[10][10]; // It will automatically inserts 0's in all positions.
List<Double> list1 = new ArrayList(new ArrayList(Collections.nCopies(10, 0d))); // Also

我想用一个二维列表来做同样的事情,这是可能的吗?

List<List<Double>> list2 = new ArrayList();
// It doesn't work -> List<List<Double>> list2 = new ArrayList(new ArrayList(Collections.nCopies(10, 0d)));

顺便说一下,我希望避免使用显式循环。


Collections.nCopies()会返回一个包含n个索引的列表,其中只包含一个元素。由于Double是不可变的,所以这样做是可以的,但是不要将其用于可变对象,比如列表。顺便说一下,内部数组列表是不需要的。即使外部列表只是一个副本,它也将包含10个对同一Double实例的引用。 - Thomas
还有:“我想避免使用显式循环” - 为什么? - Thomas
4
@Thomas 因为循环太2015了。 - njzk2
3个回答

5
List<Double> list1 = new ArrayList(new ArrayList(Collections.nCopies(10, 0d)));

这是多余的。你只需要将列表传递给第二个构造函数即可:

List<Double> list1 = new ArrayList(Collections.nCopies(10, 0d));

使用2D列表,您可以像这样完成:

List<List<Double>> list2 = new ArrayList(Collections.nCopies(10, new ArrayList(Collections.nCopies(10, 0d))));

但是要小心,该列表包含对同一列表的十倍引用。

如果您想要不同的列表并避免显式for循环,您可以使用Java 8中的隐式for循环。

List<List<Double>> list2 = new ArrayList();
Collections.nCopies(10, new ArrayList(Collections.nCopies(10, 0d))).forEach((list) -> list2.add(new ArrayList(list)));

有很大的可能性使用情况需要这些列表不同。 - njzk2
是的,我看到我复制并粘贴了这个代码:List<Double> list1 = new ArrayList(new ArrayList(Collections.nCopies(10, 0d)));,但是它是错误的,但是在我的机器上我已经改正了。感谢您的回复。 - developer033

4

比如说,流式传输:

List<List<Double>> list2 = IntStream.range(0, 10)
        .mapToObj(i -> new ArrayList<Double>(Collections.nCopies(10, 0d)))
        .collect(Collectors.toList());

它也会进行迭代,但是是隐式的。

2
以下是什么意思?
Stream.generate(() -> new ArrayList<Double>(Collections.nCopies(10, 0.0)))
      .limit(10)
      .collect(Collectors.toList());

它生成一个类型为Collections$CopiesListArrayList - developer033

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接