gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:45:00 28 4
gpt4 key购买 nike

我有以下类(class):

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 质心时,它会导致覆盖质心中的数据。例如:

First iteration: c_data.x = -1.4067 c_data.y = 0.3626 after add: 0 index: centroids.x = -1.4067 centroids.y = 0.3626

Second iteration: c_data.x = 0.1319 c_data.y = 0.7321 after add: 0 index centroids.x = 0.1319 centroids.y = 0.7321 1 index centroids.x = 0.1319 centroids.y = 0.7321

Third iteration: c_data.x = 1.4271 c_data.y = -0.2076 after add: 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) 上。随机化很好,也可以从文件中获取元素。

谢谢

最佳答案

您需要为添加到质心的每个对象执行new Data()
否则列表中的所有对象都指向堆中的同一个内存槽,
您对该对象所做的任何更改都将反射(reflect)在所有对象

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

关于java - 在Java中将我自己的数据类型添加到ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24124460/

28 4 0