添加新项目时列表中的项目被覆盖
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]);
}
}
}
}
}
我想知道你是否可以帮助我解决这个问题,我被困了一天试图解决这个问题。所以基本上我想要做的是有一个列表,其中包含一个数组的数组。
我有这个初始化
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]);
}
}
}
}
}