gpt4 book ai didi

java - 删除自定义对象的 ArrayList 中的重复项

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:05 25 4
gpt4 key购买 nike

我正在尝试从数组中删除重复的对象。

我有我的习惯,它由两个 double 组成:x 和 y。

我想做的是删除重复项 ((x && y) == (x1 && y1)) 如果 x == x1 我想保留具有较高 y 的对象。

ArrayList<MyObject> list = [x(0),y(0)], [x(0),y(0)], [x(0.5),y(0.5], [x(0.5),y(0.6)], [x(1),y(1)]; 
ArrayList<MyObject> results = [x(0),y(0)], [x(0.5),y(0.6)], [x(1),y(1)];

我尝试实现 equals 方法,但我不知道如何使用它:

public boolean equals(Object obj) {
if (obj == null || !(obj instanceof MyObject)) {
return false;
}
return (this.x == ((MyObject)obj).x);
}

列表总是使用 Collections.sort by x 排序。

谢谢大家。

最佳答案

像这样给定 MyObject:

class MyObject {
private final double x;
private final double y;

public MyObject(double x, double y) {
this.x = x;
this.y = y;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

MyObject myObject = (MyObject) o;

if (Double.compare(myObject.x, x) != 0) return false;
if (Double.compare(myObject.y, y) != 0) return false;

return true;
}

@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(x);
result = (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(y);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}

您可以实现一个 unique 方法,该方法返回一个仅包含唯一元素的列表:

private List<MyObject> unique(List<MyObject> list) {
List<MyObject> uniqueList = new ArrayList<>();
Set<MyObject> uniqueSet = new HashSet<>();
for (MyObject obj : list) {
if (uniqueSet.add(obj)) {
uniqueList.add(obj);
}
}
return uniqueList;
}

并对其进行单元测试以验证其是否有效:

@Test
public void removeDups() {
List<MyObject> list = Arrays.asList(new MyObject(0, 0), new MyObject(0, 0), new MyObject(0.5, 0.5), new MyObject(0.5, 0.6), new MyObject(1, 1));
List<MyObject> results = Arrays.asList(new MyObject(0, 0), new MyObject(0.5, 0.5), new MyObject(0.5, 0.6), new MyObject(1, 1));
assertEquals(results, unique(list));
}

注意:实现 equalshashCode 是很重要的,因为使用了 HashMap 。但是您应该始终在您的自定义类中这样做:提供适当的 equalshashCode 实现。顺便说一句,我没有编写那些 equalshashCode 方法。我让我的 IDE (IntelliJ) 从类的字段 xy 自动生成它们。

关于java - 删除自定义对象的 ArrayList 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27635757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com