当前位置:  开发笔记 > 编程语言 > 正文

删除重复项而不覆盖hashCode()

如何解决《删除重复项而不覆盖hashCode()》经验,为你挑选了1个好方法。



1> dasblinkenli..:

将感兴趣的对象包装到您自己的类中,并覆盖它hashCode/ equals以关注特定的属性子集.创建一个包装器的哈希集,然后从集合中获取对象以获得无重复的子集.

这是一个例子:

class ActualData {
    public String getAttr1();
    public String getAttr2();
    public String getAttr3();
    public String getAttr4();
}

假设您要关注属性1,2和4.然后您可以创建一个这样的包装器:

class Wrapper {
    private final ActualData data;
    public ActualData getData() {
        return data;
    }
    private final int hash;
    public Wrapper(ActualData data) {
        this.data = data;
        this.has = ... // Compute hash based on data's attr1, 2, and 4
    }
    @Override
    public int hashCode() {
        return hashCode;
    }
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Wrapper)) return false;
        Wrapper other = (Wrapper)obj;
        return data.getAttr1().equals(other.getAttr1())
            && data.getAttr2().equals(other.getAttr2())
            && data.getAttr4().equals(other.getAttr4());
    }
}

现在你可以做一个HashSet:

Set set = new HashSet<>();
for (ActualData item : listWithDuplicates) {
    if (!set.add(new Wrapper(item))) {
        System.out.println("Item "+item+" was a duplicate");
    }
}

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有