创建ArrayList <integer> </integer>的ArrayList

时间:2012-02-03 01:41:31

标签: java multidimensional-array arraylist

我正在尝试使用下面的代码来创建一个多维ArrayList。我的代码填充内部ArrayList(localSolutions)就好了,但是当我尝试将ArrayList添加到外部ArrayList(解决方案)时,出现了问题,并且它添加了空ArrayLists。

public class MathCapstone {

public static void main(String[] args) {
    ArrayList<ArrayList<Integer>> list = entireList(10);

    for(int q = 0;q<list.size();q++) {
        System.out.println(list.get(q));
    }

public static ArrayList<ArrayList<Integer>> entireList(int max) {
    ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();

    for(int i = 1; i <= max; i++) {
        for(int j = 1; j < i; j++) {
           //System.out.println(j + "mod" + i + "=" + (j*j)%i);
            if ((j*j)%i == 1) {
                localSolutions.add(j);
            }
        }
        //System.out.println(localSolutions.toString());
        solutions.add(localSolutions);
        localSolutions.clear();
    }
    return solutions;
}

最后要说明的是:使用ArrayLists的HashMap会不会更好(最终我将创建最大值约为10k的CDF)?

2 个答案:

答案 0 :(得分:3)

您正在清除 localSolutions 列表。

在Java中,您只能通过值复制对Object的引用而不是实际对象本身。因此,当您在解决方案列表中添加 localSolutions 列表时, localSolutions 引用和解决方案的第一个条目 list,指向同一个对象。

因此,当您清除 localSolutions 列表时,您可以有效清除解决方案列表中的第一个条目。

答案 1 :(得分:3)

你在做:

localSolutions.clear();

将列表添加到另一个列表不会添加列表的副本,它会添加相同的列表对象。您的代码在外环中执行的操作是使用元素填充相同的列表,清空它并将其添加到solutionssolutions包含max对相同空列表的引用。

您想要做的是:

ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
for(int i = 1; i <= max; i++) {
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();
    for(int j = 1; j < i; j++) {
       //System.out.println(j + "mod" + i + "=" + (j*j)%i);
        if ((j*j)%i == 1) {
            localSolutions.add(j);
        }
    }
    //System.out.println(localSolutions.toString());
    solutions.add(localSolutions);
}