在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>();