ArrayList的ArrayList显示不需要的结果

时间:2015-01-21 02:43:46

标签: java

//I want my to be something like this: [[0,0],[0,1],[0,2].....,[4,2],[4,3]]


public class Japan {

public static void main(String[]args) {
    ArrayList<ArrayList<Integer>> nodes = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> nodeList = new ArrayList<Integer>();
    for(int i =0;i<5;i++) {
        for(int j=0;j<4;j++) {
            nodeList.add(i);
            nodeList.add(j);
            nodes.add(nodeList);
            nodeList.remove(1);
            nodeList.remove(0);
         }
    }
    System.out.println(nodes);
}}

2 个答案:

答案 0 :(得分:0)

您需要确保为每个i索引初始化列表

for(int i = 0; i < 5; i++){
    list.add(new ArrayList<Object>());
}

然后执行以下操作:

for(int i = 0; i <5; i++){
    for(int j = 0; j < 4; j++){
        list.get(i).add(j);
    }
}

答案 1 :(得分:0)

您的问题是因为您正在重复使用相同的内部ArrayList - 您将内部ArrayList多次添加到外部ArrayList,并且添加到内部ArrayList的所有内容都将被删除,因此当您打印它时,内部列表是空。

nodes.add(nodeList) 复制nodeList - 它会添加对同一列表的引用。

您需要在致电nodes.add时创建副本:

public class Japan {

public static void main(String[]args) {
    ArrayList<ArrayList<Integer>> nodes = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> nodeList = new ArrayList<Integer>();
    for(int i =0;i<5;i++) {
        for(int j=0;j<4;j++) {
            nodeList.add(i);
            nodeList.add(j);
            nodes.add(new ArrayList<>(nodeList)); // This copies nodeList, and adds the copy to nodes
            nodeList.remove(1);
            nodeList.remove(0);
         }
    }
    System.out.println(nodes);
}}

或每次循环创建一个新的内部列表:

public class Japan {

public static void main(String[]args) {
    ArrayList<ArrayList<Integer>> nodes = new ArrayList<ArrayList<Integer>>();
    for(int i =0;i<5;i++) {
        for(int j=0;j<4;j++) {
            ArrayList<Integer> nodeList = new ArrayList<Integer>(); // this creates a new list each time it is executed
            nodeList.add(i);
            nodeList.add(j);
            nodes.add(nodeList);
         }
    }
    System.out.println(nodes);
}}

这两个都可行,但我(可能是大多数程序员)发现第二个更容易理解,所以我更喜欢这种方法。 (如果你看不到为什么第二个更容易理解,它会及时来到你身边)