我正在尝试使用下面的代码来创建一个多维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)?
答案 0 :(得分:3)
您正在清除 localSolutions 列表。
在Java中,您只能通过值复制对Object的引用而不是实际对象本身。因此,当您在解决方案列表中添加 localSolutions 列表时, localSolutions 引用和解决方案的第一个条目 list,指向同一个对象。
因此,当您清除 localSolutions 列表时,您可以有效清除解决方案列表中的第一个条目。
答案 1 :(得分:3)
你在做:
localSolutions.clear();
将列表添加到另一个列表不会添加列表的副本,它会添加相同的列表对象。您的代码在外环中执行的操作是使用元素填充相同的列表,清空它并将其添加到solutions
。 solutions
包含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);
}