我有一个包含Person
的课程String firstName, lastName
。我想将此类的实例插入List
,但我不想插入重复项。
如何使用HashSet
使用类似firstName+lastName
的内容来计算重复内容?
答案 0 :(得分:10)
您的equals()
课程需要hashCode()
和Person
方法。
equals()
很简单,对于hashCode()
,最简单的解决方案是:
public int hashCode() {
return Arrays.hashCode( new Object[] { firstName, lastName } );
}
虽然如果你的Person
对象是不可变的(因为它应该是,如果你把它放在HashSet中),你应该缓存这个值。
答案 1 :(得分:3)
您需要让.equals()
方法返回true
两个Person
,并使用相同的名字和姓氏。您还需要实现.hashcode()
方法以确保两个相等的对象具有相同的哈希码。
您的问题是指使用List,然后提到HashSet。如果保留插入顺序非常重要,那么HashSet
不是您想要的,您应该使用LinkedHashSet
。
答案 2 :(得分:1)
重要 - >您需要实现equals AND hashcode
始终实施两者。并且它们必须一致 - >如果2个对象是等于的,则它们必须具有相同的哈希码。
这非常重要。 再读一遍。 :)
HashSets和HashMaps使用hashcode和equals来比较元素。不同的元素可能具有相同的哈希码,但它们不等于
答案 3 :(得分:0)
您应该使用Set
代替List
。如果您关心广告订单,请使用LinkedHashSet
。