簡體   English   中英

添加新項目時,列表中的項目被覆蓋

[英]Items in list are Overwritten when adding new items

我想知道您是否可以解決這個問題,我在解決這一問題上呆了一天。 所以基本上我想做的是有一個包含一個數組數組的列表。

我有這個初始化

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)相同的值

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約定。 班級名稱以駝峰大寫字母開頭; 變量和方法應以小寫字母開頭。 循環應在for: for( int run = 0;... )聲明循環計數器。 避免在課程領域public 代碼獲取器和設置器以訪問私有類字段。

您可以結合使用數組和迭代器來完成工作,

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

            }

        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM