添加新项目时列表中的项目被覆盖

Items in list are Overwritten when adding new items

我想知道你是否可以帮助我解决这个问题,我被困了一天试图解决这个问题。所以基本上我想要做的是有一个列表,其中包含一个数组的数组。

我有这个初始化

List<double[][]> points = new ArrayList<double[][]>(); 

我这样添加元素:

points.add(existing.Foods);

我的 beeColony class 包含我要添加的数据:

public  class beeColony{
    double Foods[][]=new double[FoodNumber][D];
    ....
}

下面是我如何声明它的一个实例:

public beeColony existing=new beeColony();

这是代码片段:

for(run=0;run<existing.runtime;run++)
{
    for (iter=0;iter<existing.maxCycle;iter++)
        points.add(existing.Foods);
}

发生的情况是,当我输出列表中的所有项目时,它只包含最后添加的项目。

例如:

Foods = {(0,0), (1,1), (2,2), (3,3)}
points.add(Foods);
Foods = {(4,4), (5,5), (6,6), (7,7)}
points.add(Foods);

我的理解是这样的 points.get(0)[0] 应该包含 0,0 等等,points.get(1)[0] 应该包含 4,4 等等。但是发生的是 points.get(0) 也具有与 points.get(1)

相同的值

ArrayList<X> 这样的集合包含对 X 对象的 引用 ,就像字符串的一端,另一端是对象本身的 "tied",即,数据所在的位置。

对于像 double[][] 这样的数组也是如此。

你所做的就是重复复制和存储引用端,但在另一端有一个相同的double[][]。您可以更改该数组的内容,但所有存储的字符串结尾都指向同一个数组对象。

您必须创建该数组的新副本以保存不同的数组值。如果您创建另一个 BeeColony,它将有另一个 foods 数组。否则,使用 new double[m][n] 并复制值。是这样的:

double[][] d = { {1,2}, {3,4}, {5,6} };
// create the vector of (still missing) rows:
double[][] copy = new double[d.length][];
for( int row = 0; row < d.length; ++row ){
    // create another row of appropriate length:
    copy[row] = new double[d[row].length];
    // copy the element values
    System.arraycopy( d[row], 0, copy[row], 0, d[row].length );
}

PS:您应该遵守 Java 约定。类名以大写字母开头的驼峰式书写;变量和方法应该以小写字母开头。循环应该在 for: for( int run = 0;... ) 中声明循环计数器。避免 public 用于 class 字段;访问私有 class 字段的 getter 和 setter 代码。

您可以结合使用数组和迭代器来完成工作,

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class listerr {

    static int getrandom(){
        Random r = new Random();
        int next = r.nextInt(100);
        return next;
    }

    static double[][] getarr(){
        double[][] arr =  {{getrandom(),getrandom()}, {getrandom(),getrandom()},
                {getrandom(),getrandom()}, {getrandom(),getrandom()}};
        return arr;
    }


    public static void main(String[] args) {
        List<double[][]> points = new ArrayList<double[][]>(); 


        for(int run=0;run<3;run++)
        {
            double[][] arr = getarr();
            points.add(arr);
        }

        Iterator itr = points.iterator();
        while(itr.hasNext()){
            double[][] dbl = (double[][]) itr.next();
            for (int i=0;i<4;i++)
            { for (int j=0;j<2;j++){

                System.out.println(dbl[i][j]);
            }

            }

        }
    }
}