在Java中将我自己的数据类型添加到ArrayList
我有以下课程:在Java中将我自己的数据类型添加到ArrayList,java,arraylist,Java,Arraylist,我有以下课程: class Data { double x,y,disc,asoc; public Data(double a,double b){ x = a; y = b; } } 在另一节课上,我有: public class Kmeans { public Kmeans(int v1,int v2){ k = v1; samples = v2; read(); ce
class Data {
double x,y,disc,asoc;
public Data(double a,double b){
x = a;
y = b;
}
}
在另一节课上,我有:
public class Kmeans {
public Kmeans(int v1,int v2){
k = v1;
samples = v2;
read();
centro();
}
Data c_data = new Data(0,0);
List<Data> data_v = new ArrayList<>();
List<Data> centroids = new ArrayList<>();
void read(){
//Reading elements from file, adding them to data_v.x and data_v.y
}
void centro(){
Random rand = new Random();
for(int i=0;i<k;i++){
int r = rand.nextInt(ilosc);
c_data.x = data_v.get(r).x;
c_data.y = data_v.get(r).y;
centroids.add(c_data);
}
for(int j=0;j<centroids.size();j++) //print centroids.x and centroids.y
}
我对centro函数有一个问题,当我试图将来自data_v.x和data_v.y的随机数据添加到ArrayList质心时,它会导致覆盖质心中的数据。
例如:
第一次迭代:c_data.x=-1.4067 c_data.y=0.3626后加:0
索引:质心.x=-1.4067质心.y=0.3626
第二次迭代:c_数据。x=0.1319 c_数据。y=0.7321后加:0
索引质心。x=0.1319质心。y=0.7321 1索引质心。x=
0.1319质心。y=0.7321
第三次迭代:c_data.x=1.4271 c_data.y=-0.2076后加:0
索引质心.x=1.4271质心.y=-0.2076 1索引质心.x=
1.4271质心。y=-0.2076 2索引质心。x=1.4271质心。y=-0.2076
输出:来自上一次迭代的十个相同元素
谁能告诉我我做错了什么?上面的数据来自调试器,所以问题在于质心。添加(c_数据)。随机化很好,也可以从文件中获取元素
谢谢对于添加到质心的每个对象,
否则,列表中的所有对象都指向堆中的同一内存插槽,
而
您对该对象所做的任何更改都将反映在所有对象上
void centro(){
Random rand = new Random();
for(int i=0;i<k;i++){
int r = rand.nextInt(ilosc);
Data c_data = new Data(0,0); //<== add this line
c_data.x = data_v.get(r).x;
c_data.y = data_v.get(r).y;
centroids.add(c_data);
}
for(int j=0;j<centroids.size();j++) //print centroids.x and centroids.y
}
void centro(){
Random rand=新的Random();
对于(int i=0;i对象的引用范围跨越循环的所有迭代,因此相同的对象在每次迭代中都会得到更新。您需要在每次迭代中实例化一个新对象,以便在最终列表中添加一个新对象质心
哦,谢谢,它成功了,但现在c_数据在centro隐藏kmeans类中声明的c_数据。如果我在kmeans类中的其他函数上使用c_数据会怎么样?它仍然可用?或者我应该删除数据c_数据=新数据(0,0);在kmean类中?取决于您首先声明它的原因。如果要仅在此方法中使用它,请删除它。如果要更全局地使用它,请重命名centro方法中的局部变量
void centro(){
Random rand = new Random();
for(int i=0;i<k;i++){
int r = rand.nextInt(ilosc);
Data c_data = new Data(0,0); //<== add this line
c_data.x = data_v.get(r).x;
c_data.y = data_v.get(r).y;
centroids.add(c_data);
}
for(int j=0;j<centroids.size();j++) //print centroids.x and centroids.y
}
List<Data> data_v = new ArrayList<>();
List<Data> centroids = new ArrayList<>();
List<Data> data_v = new ArrayList<Data>();
List<Data> centroids = new ArrayList<Data>();