使用零填充2D ArrayList

时间:2016-03-31 13:16:27

标签: java arraylist collections

我知道我可以使用以下语句填充一些zeros的正常vetor /列表:

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

我想使用2D列表做同样的事情 BUT ,是否可能?

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

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

3 个答案:

答案 0 :(得分:4)

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

这是多余的。您将列表传递给secound构造函数。这就足够了:

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

使用2D List你可以这样做:

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

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

如果你想拥有不同的列表并避免和显式for循环,你可以使用一个隐式for循环和java 8.

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

答案 1 :(得分:4)

Stream,例如:

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

它也会迭代,但隐含地。

答案 2 :(得分:2)

以下情况如何?

Stream.generate(() -> new ArrayList<Double>(Collections.nCopies(10, 0.0)))
      .limit(10)
      .collect(Collectors.toList());