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

标签 java performance

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

相关文章:

java - 我想在 Android 中解析 Google Map API 以进行反向地理编码

java - linux - 无法查看从 java 创建的目录

java - 运行可执行 jar 文件时未找到类错误(使用 eclipse 导出的 RMI 应用程序)

java - IntelliJ 运行/调试配置中的变量

java - setOnTouchListener 问题

java - 跨主机名并行下载

performance - F# 中嵌套序列涉及的开销

mysql - mysql UPDATE 比 INSERT INTO 快吗?

python - 用所有相交条目的并集更新所有列表条目的最快方法

mysql - 缓慢删除临时表