在Java中将我自己的数据类型添加到ArrayList

时间:2014-06-09 16:20:58

标签: 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();
        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很好,从文件中获取元素。

由于

2 个答案:

答案 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中添加新对象。