2014-06-09 51 views
1

到ArrayList中我有以下类:加入我自己的数据类型在Java中

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质心时,它会导致以cen troids。 例如:

第一次迭代:c_data.x = -1.4067 c_data.y = 0.3626添加后:0 指数:centroids.x = -1.4067 centroids.y = 0.3626

第二次迭代:C_DATA .X = 0.1319 c_data.y = 0.7321添加后:0 指数centroids.x = 0.1319 centroids.y = 0.7321 1索引centroids.x = 0.1319 centroids.y = 0.7321

第三次迭代:c_data.x = 1.4271 c_data.y = -0.2076增加后:0 指标质心x = 1.4271 centroids.y = -0.2076 1 inde X centroids.x = 1.4271 centroids.y = -0.2076 2指数centroids.x = 1.4271 centroids.y = -0.2076

输出:从去年十种迭代相同的元素..

有人可以告诉我我做错了什么?上面的数据来自调试器,所以问题在于centroids.add(c_data)。随机化很好,从文件中获取元素。

感谢

回答

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>(); 
+0

噢,谢谢你的工作,但现在c_data在centro隐藏c_data在kmeans类中声明。如果我将在kmeans类的其他函数上使用c_data,该怎么办?它仍然可用?或者,也许我应该删除数据c_data = new Data(0,0);在kmean班? – soncrash

+0

取决于你首先声明它的原因。如果仅在此方法中使用它,则将其删除。如果要更全局地使用它,请在centro方法内重命名局部变量 –

0

c_data对象的参考范围跨越环的所有迭代跨越,并且因此相同的对象是在每次迭代中得到更新。您需要在每次迭代中实例化一个新对象,以便在最终列表中添加一个新对象centroids

相关问题