插入新记录时,列表将覆盖先前添加的记录

时间:2017-11-22 04:51:33

标签: java

我有一个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]]

3 个答案:

答案 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())

这是我找到的解决方案,可能存在更好的解决方案。 如果任何人可以建议其他更好的解决方案,将不胜感激。

相关问题