Java 插入新记录时,列表将覆盖以前添加的记录
我有一个Java代码,其中有一个基本上存储长[]数组的列表。 在for循环中,长[]数组每次都会更新(如果某些条件满足),并将其添加到列表中。 将新数组添加到列表时,将修改先前添加的数组内容。我怎样才能得到我添加到列表中的确切内容? 谢谢你的建议。谢谢 我的代码:[可以执行]Java 插入新记录时,列表将覆盖以前添加的记录,java,Java,我有一个Java代码,其中有一个基本上存储长[]数组的列表。 在for循环中,长[]数组每次都会更新(如果某些条件满足),并将其添加到列表中。 将新数组添加到列表时,将修改先前添加的数组内容。我怎样才能得到我添加到列表中的确切内容? 谢谢你的建议。谢谢 我的代码:[可以执行] import java.util.List; import java.util.ArrayList; import java.util.Arrays; public class MyClass { public s
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;
}
}
}
但我得到以下回应(您可以看到第一条记录也被修改):
一个常见的错误。将当前
对的构造移动到内部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()));
}
您正在方法顶部创建长数组,因此只有一个数组。将同一数组重新添加到列表中,然后在下一个循环中更改其中的值。因此,该列表有多个条目,但它们都指向同一数组
通常,最好在要使用对象的范围内构造对象。首先在列表中插入数组,以便将该数组的引用存储在列表中。
现在,在第二次循环中,您再次修改了由于相同引用而被添加到列表中的第一个数组所修改的相同数组。
您可以使用clone()解决此问题
将list\u all.add(pairs\u current)
替换为list\u all.add(pairs\u current.clone())
这就是我发现的解决方案,可能存在更好的解决方案。
如果有人能提出其他更好的解决方案,我们将不胜感激 首先让我们看看您的代码
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语句第二次运行时将其添加到列表中,然后将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语句时,我们都会创建一个新数组并将其添加到列表中,这就是您获得所需输出的方式共享您的代码。请共享您迄今为止尝试过的代码。您好@Sara Tirmizi,现在已经添加了代码段。请看一看。谢谢。我认为@slipperyseal给出的上述答案是更好的解决方案。谢谢,是的,这只是一个简单的范围问题。从技术上讲,克隆可能可行,但在需要时简单地创建一个新阵列更简单、更符合逻辑。
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()));
}
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()));
}