gpt4 book ai didi

java - 从列表中删除具有相同内容(自定义 .equals() )的重复项的快速方法

转载 作者:行者123 更新时间:2023-12-01 19:29:08 25 4
gpt4 key购买 nike

所以我搜索了这个“问题”,只遇到了询问如何从列表中删除真实重复项的问题。 但我想要的是根据自定义 .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/

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