我有很多字段的列表,我想在其中几个字段中找到重复字段。
例如:
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解决方案,或者我是否有自己写算法?
答案 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>
实例。