所以我搜索了这个“问题”,只遇到了询问如何从列表中删除真实重复项的问题。 但我想要的是根据自定义 .equals() 方法删除与列表中另一个对象相等的每个对象。
这里我有一个示例类,其中 equals() 方法被重写:
private static class Test {
int x;
float[] data;
public Test(int x, float[] data) {
this.x = x;
this.data = data;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Test) {
Test compare = (Test) obj;
if (
compare.x == this.x &&
Arrays.equals(compare.data, this.data)
) {
return true;
}
}
return false;
}
}
现在,以下内容当然不会相同(例如,没有可以通过 HashMap 消除的重复项):
Test test1 = new Test(3, new float[]{0.1f, 0.4f});
Test test2 = new Test(3, new float[]{0.1f, 0.4f});
但就我而言,它们是重复的,我只想保留其中一个。
我想出了这个方法:
Test test1 = new Test(3, new float[]{0.1f, 0.4f});
Test test2 = new Test(3, new float[]{0.1f, 0.4f});
Test test3 = new Test(2, new float[]{0.1f, 0.5f});
List<Test> list = new ArrayList<>();
list.add(test1);
list.add(test2);
list.add(test3);
Set<Test> noDuplicates = new HashSet<>();
for (Test testLoop : list) {
boolean alreadyIn = false;
for (Test testCheck : noDuplicates) {
if (testLoop.equals(testCheck)) {
alreadyIn = true;
break;
}
}
if (!alreadyIn) {
noDuplicates.add(testLoop);
}
}
这工作得很好,但在性能方面并不是那么好。 (就我而言,这很重要,因为列表大小可能很大)
现在我的问题:是否有更方便的方法来实现这一目标?
最佳答案
我可能完全误解了您的需要,但我认为您只需要覆盖 hashCode() 即可在 equals 为 true 的情况下生成相同的哈希代码。
这是一个为compare.data生成哈希码的方法。如果这样做,那么您只需将所有元素添加到 hastSet 中即可删除重复项。
记住规则:如果覆盖 equals,则还必须覆盖 hashCode。
关于java - 从列表中删除具有相同内容(自定义 .equals() )的重复项的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60345978/