在Java中与Python中的等价是什么?
array_name = [0 for i in range(5)]
具体来说,我想创建一个二维Java数组列表,并将每个值初始化为0。这就是我所想的,在半伪代码中,遵循Python,但它显然不起作用:
ArrayList<ArrayList<Integer>> grid = new ArrayList<ArrayList<Integer>>() {{
(add(Arrays.asList(0 for i : ROWS) for j : COLUMNS);
}};
其中ROWS和COLUMNS是在其他地方定义的常量。最后,我想要一个2D数组列表,由ROWS和COLUMNS常量给出的大小,每个值初始化为0。有办法做到这一点吗?
和数组列表不允许基本类型作为泛型(如基本类型int)。那么引用类型没有默认值0,因为它是一个对象。所以任何关于数组初始化为0的问题都与int基本类型无关
用0初始化ArrayList
可以使用nCopies方法
int ROWS =3;
int COLUMNS=3;
List<List<Integer>> twoDimArray = new ArrayList<List<Integer>>();//declaration
for (int i = 0; i < ROWS ; i++) { // cant rows
twoDimArray.add(Collections.nCopies(COLUMNS, new Integer(0)));
//initialized to zero the number of columns you want
}
/* Print */
for (List<Integer> list : twoDimArray) {
System.out.println(list);
}
在这个例子中,使用List <>来代替ArrayList,因为它太多了更好的…以及对这篇评论的参考Java中的类型列表和类型数组列表
ArrayList<ArrayList<Integer>> grid = new ArrayList<>();
for (int i = 0; i < ROWS; i ++) {
ArrayList<Integer> row = new ArrayList<>();
for (int j = 0; j < COLUMNS; j ++) {
row.add(Integer.valueOf(0));
}
grid.add(row);
}
在java 8中,等效的是:
List<List<Integer>> grid = Stream.generate(() -> Collections.nCopies(COLUMNS, 0))
.limit(ROWS)
.collect(Collectors.toList());
注意,不能修改Collections.nCopies
返回的列表,因此更好的替代方法可能是:
List<List<Integer>> grid = Stream.generate(() -> new ArrayList<>(Collections.nCopies(COLUMNS, 0)))
.limit(ROWS)
.collect(Collectors.toList());
如果你真的需要栅格的类型是ArrayList<ArrayList>
,你做:
ArrayList<ArrayList<Integer>> grid = Stream.generate(() -> new ArrayList<>(Collections.nCopies(COLUMNS, 0)))
.limit(ROWS)
.collect(Collectors.toCollection(ArrayList::new));