【发布时间】:2014-05-11 23:21:06
【问题描述】:
情况:
假设我有一个这样的类:
class Person {
public String name;
public String surname;
public age;
}
现在我想根据一些先前创建的列表(包含一些重复项)创建一个包含一些人的集合。当然,当我创建集合时,我不想在里面有任何重复。
HashSet<Person> mySet = new LinkedHashSet<Person>(listOfPeople);
问题: 让我们假设,在某些情况下,“无重复” 对我来说意味着 “不同名字的人”。在其他情况下“不同年龄的人”等等。
我看到HashSet 的add 方法使用来自HashMap 的put:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { // <== !!
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
问题:
所以,我知道我应该简单地覆盖Person 中的equals,并记住根据我的要求为应该“相等”的对象返回相同的hashCode。但是如果我的“平等”术语在运行时发生变化怎么办?
我在问,因为在使用Collections.sort 对集合进行排序时,我可以指定自定义Comparator,这使我能够根据情况提供比较逻辑。
是否有任何你知道的类比机制或解决方案,使我能够在运行时决定创建一组元素时组件是否相等?
我现在唯一的解决方案是在 Person 类中定义一些静态 Comparator,然后以它使用此比较器的方式覆盖一个 equals 方法。然后,通过替换 Person 中的 Comparator,我实际上是在更改 equals 逻辑......这有意义吗?
【问题讨论】:
标签: java duplicates add hashset comparator