为Java

时间:2016-06-09 08:54:02

标签: java containers

我有很多字段的列表,我想在其中几个字段中找到重复字段。

例如:

class Person {
    String givenName, surName, country, city, street;
    int id;
    @Override
    public boolean equals(Object other)
    {
        if (other == null) return false;
        if (!(other instanceof Person)) return false;
        return ((Person)other).id == id;
    }
    @Override
    public hashCode() { return id; }
}

将列表转换为集合,只会找到同一个人的重复条目 - 但有没有办法创建一个自定义集合,让我根据任何其他字段过滤掉重复项?

在C ++中,您可以在构造时给容器一个功能(或者使用具有功能的std算法)来确定对象的顺序\是否相同 - 是否有这样的Java解决方案,或者我是否有自己写算法?

2 个答案:

答案 0 :(得分:3)

当前java.util类不支持自定义哈希算法。但是您可以使用其他哈希容器。例如Eclipse Collections(以前的GS集合)它有HashingStrategy接口。

PS 感谢@ Mr.WorshipMe评论

答案 1 :(得分:2)

您可以使用TreeSet<Person>并传递Comparator<Person>来确定元素的顺序和元素的唯一性。

如果compare的{​​{1}}方法针对两个Comparator<Person>个实例返回0,则Person会认为它们是TreeSet<Person>相同。

请注意,对于您希望确定Person个对象相等的每个条件,您必须使用不同的Person创建单独的TreeSet<Person>实例。