我有一个Java代码,其中有一个List,它基本上存储了long []数组。 在for循环中,long []数组每次都会更新(如果满足某些条件)并将其添加到List中。 将新数组添加到List时,先前添加的数组内容将被修改。如何获得列表中包含我添加到其中的确切内容? 感谢您的建议。谢谢!
我的代码:[可执行]
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class MyClass {
public static void main(String args[]) {
removNb(26);
}
public static List<long[]> removNb(long n) {
if(n<1100){
long sum = 0;
long[] pairs_current = new long[2];
List<long[]> list_all = new ArrayList<>();
for (long i=1; i<=n; i++){
sum+= i;
}
for (long j=1; j<=n;j++){
for (long k=1; k<=n;k++){
if(j*k == sum-(j+k)){
//System.out.println("j:"+j+" k:"+k);
pairs_current[0] = j;
pairs_current[1] = k;
list_all.add(pairs_current);
System.out.println("pairs_current:"+Arrays.toString(pairs_current));
System.out.println("list_all:"+Arrays.deepToString(list_all.toArray()));
}
}
}
return list_all;
}
else {
return null;
}
}
}
以下是预期的输出:
pairs_current:[15, 21]
list_all:[[15, 21]]
pairs_current:[21, 15]
list_all:[[15, 21], [21, 15]]
但我作为回应得到了以下(你可以看到第一条记录也被修改):
pairs_current:[15, 21]
list_all:[[15, 21]]
pairs_current:[21, 15]
list_all:[[21, 15], [21, 15]]
答案 0 :(得分:4)
一个常见的错误。将pairs_current
的构造移动到内部if语句中......
if(j*k == sum-(j+k)){
//System.out.println("j:"+j+" k:"+k);
long[] pairs_current = new long[2];
pairs_current[0] = j;
pairs_current[1] = k;
list_all.add(pairs_current);
System.out.println("pairs_current:"+Arrays.toString(pairs_current));
System.out.println("list_all:"+Arrays.deepToString(list_all.toArray()));
}
您正在方法的顶部创建长数组,因此只有一个数组。您将相同的数组重新添加到列表中,然后在下一个循环中更改其中的值。所以列表有多个条目,但它们都指向同一个数组。
通常最好在你要使用它们的范围内构造对象。
答案 1 :(得分:2)
首先让我们看看你的代码
if(j*k == sum-(j+k)){
//System.out.println("j:"+j+" k:"+k);
pairs_current[0] = j;
pairs_current[1] = k;
list_all.add(pairs_current);
System.out.println("pairs_current:"+Arrays.toString(pairs_current));
System.out.println("list_all:"+Arrays.deepToString(list_all.toArray()));
}
你创建了一个大小为2的数组,并用15,21
填充它,并在if语句第一次运行时将其添加到列表中,当if语句运行second
时,它再次添加到列表中向数组中添加了21,15
的新数据,然后将数组添加到列表中,但是您忘记了只有一个数组,并且当if语句第二次运行时,它会使用相同的数据更新数组那是21,15
现在是新的if语句
if(j*k == sum-(j+k)){
//System.out.println("j:"+j+" k:"+k);
long[] pairs_current = new long[2];
pairs_current[0] = j;
pairs_current[1] = k;
list_all.add(pairs_current);
System.out.println("pairs_current:"+Arrays.toString(pairs_current));
System.out.println("list_all:"+Arrays.deepToString(list_all.toArray()));
}
这里每次if语句执行时我们都会创建一个新数组并将其添加到列表中,这就是你如何获得所需的输出
答案 2 :(得分:0)
首先,您在列表中插入数组,以便该数组的引用存储在列表中。 现在,在第二次循环时,您正在修改相同的数组,由于相同的引用,该数组将修改列表中添加的第一个数组。 您可以使用clone()来解决此问题。
将list_all.add(pairs_current)
替换为list_all.add(pairs_current.clone())
这是我找到的解决方案,可能存在更好的解决方案。 如果任何人可以建议其他更好的解决方案,将不胜感激。