2
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
    ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value

    for (int j = 0; j < 3; j++) {
        for (int i = 0; i < 5; i++) {
            al.add(i + j);
        }
        System.out.println(al);
        System.out.println(j);//key value
        map.put(j, al);
        System.out.println(map);
        al.clear();
    }

为什么最后一个值数组列表会在所有键上被覆盖?如何避免过度书写?

4

2 回答 2

8

您需要移动此行:

ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value

循环内。

您想ArrayList为每个对象创建一个,而不仅仅是为所有对象创建一个。

for (int j = 0; j < 3; j++) {
    ArrayList<Integer> al = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        al.add(i + j);
    }
    System.out.println(al);
    System.out.println(j);//key value
    map.put(j, al);
    System.out.println(map);
}
于 2013-05-13T12:54:13.217 回答
0

你不能通过ArrayList清除它来重用旧的,你需要每次创建一个新的:

for (int j = 0; j < 3; j++) {
    ArrayList<Integer> al = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        al.add(i + j);
    }
    System.out.println(al);
    System.out.println(j);//key value
    map.put(j, al);
    System.out.println(map);
}

原因是HashMap所有条目都指向相同的条目,ArrayList每次运行都会被覆盖。

于 2013-05-13T12:57:11.607 回答