现在有这么一个需求,我现在需要实现一个可变的n*n的方阵,也就是说,他的行和列都可变,用ArrayList实现

先来看一下代码,看看会输出什么:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> al = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            add(al);
        }
        for (ArrayList<Integer> list : al){
            System.out.println(list);
        }
    }

    // 给矩阵添加一行一列
    public static void add(ArrayList<ArrayList<Integer>> al) {
        for (ArrayList<Integer> list : al){
            list.add(0);
        }
        al.add(new ArrayList<>(al.size()+1));
    }
}

按理说,我们期望的输出应该为:

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

而实际输出为:

[0, 0, 0, 0]
[0, 0, 0]
[0, 0]
[0]
[]

原因何在,这里就需要提到Java中ArrayList的size和cap的区别了

  • 在Java中,cap指的是当前的容量,size指的是当前的大小
  • 在Java中,是通过size判断是否索引越界的
  • new ArrayList<>(int);里面的参数为cap,而非size

因此,如果要达到目的,应该将上述代码中的 add方法改为如下:

public static void add(ArrayList<ArrayList<Integer>> al) {
    for (ArrayList<Integer> list : al){
        list.add(0);
    }
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < al.size() + 1; i++) {
        list.add(0);
    }
    al.add(list);
}

输出:

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

符合预期。

最后修改:2022 年 07 月 03 日
如果觉得我的文章对你有用,请随意赞赏