我知道我可以使用以下语句填充一些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)));
顺便说一下,我想避免使用显式循环。
答案 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());