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

时间:2015-02-12 05:16:42

标签: java list arraylist

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

我有这个初始化

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

我以这种方式添加元素:

points.add(existing.Foods);

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

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)

相同的值

2 个答案:

答案 0 :(得分:1)

ArrayList<X>这样的集合包含引用到X对象,比如字符串的一端,另一端与对象本身“绑定”,即数据所在的位置。

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

您所做的是重复复制和存储参考结束,但另一端有同一个double[][]。您可以更改该数组的内容,但所有存储的字符串末尾都会导致相同的数组对象。

您必须创建该数组的新副本以保存不同的数组值。如果你创建另一个BeeColony,它将有另一个食物阵列。否则,请使用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约定。 Classe名字是用大写字母写的,用大写字母开头;变量和方法应以小写字母开头。循环应该在for:for( int run = 0;... )内声明循环计数器。对于类字段,请避免使用public;代码getter和setter访问私有类字段。

答案 1 :(得分:0)

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

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]);
            }

            }

        }
    }
}