我上课了:
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
}
我的主要人物:
public static void main(String[] args) {
new Kmeans(10,10000);
}
我遇到了centro函数的问题,当我试图将data_v.x和data_v.y中的随机数据添加到ArrayList质心时,它会导致覆盖质心中的数据。 例如:
第一次迭代:c_data.x = -1.4067 c_data.y = 0.3626 add:0 index:centroids.x = -1.4067 centroids.y = 0.3626
第二次迭代:c_data.x = 0.1319 c_data.y = 0.7321添加后:0 index centroids.x = 0.1319 centroids.y = 0.7321 1 index centroids.x = 0.1319 centroids.y = 0.7321
第三次迭代:c_data.x = 1.4271 c_data.y = -0.2076添加后:0 index centroids.x = 1.4271 centroids.y = -0.2076 1 index centroids.x = 1.4271 centroids.y = -0.2076 2 index centroids.x = 1.4271 centroids.y = -0.2076
输出:上次迭代中的十个相同元素..
有人可以告诉我我做错了什么吗?上面的数据来自调试器,因此问题在于centroids.add(c_data)。 Randomize很好,从文件中获取元素。
由于
答案 0 :(得分:1)
您需要为添加到质心的每个对象执行new Data()
,
否则列表中的所有对象都指向堆中的相同内存插槽,
您对该对象所做的ANY
更改将反映在all the objects
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>();
答案 1 :(得分:0)
c_data
对象的引用范围跨越循环的所有迭代,因此在每次迭代中相同的对象都会更新。您需要在每次迭代中实例化一个新对象,以便在最终列表centroids
中添加新对象。