Java等同于python数组初始化

Java equivalent to python array initialization

Java 中的这个与 Python 中的等价物是什么?

array_name = [0 for i in range(5)]

具体来说,我想创建一个二维 Java ArrayList 并将每个值初始化为 0。这就是我在半伪代码中的想法,遵循 Python,但显然没有不工作:

ArrayList<ArrayList<Integer>> grid = new ArrayList<ArrayList<Integer>>() {{
    (add(Arrays.asList(0 for i : ROWS) for j : COLUMNS);
}};

其中 ROWS 和 COLUMNS 是在别处定义的常量。最后,我想要一个 2D ArrayList,其大小由 ROWS 和 COLUMNS 常量给出,每个值都初始化为 0。有没有办法做到这一点?

并且 ArrayList 不允许将原始类型作为泛型类型(如原始 int)。然后拥有引用类型没有默认值 0,因为它是一个对象。因此,关于将数组初始化为 0 的任何其他与原始 int 有关的问题都不会回答我的问题。

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

要用零初始化 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);
    }

In the example use the List <> to replace ArrayList as it is much better ... and for references to this review Type List vs type ArrayList in Java

在 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));