現狀:防止重複而增加設置
讓我們假設我有一個這樣的類:
class Person {
public String name;
public String surname;
public age;
}
現在我要創建一組包含的一些基礎上某些人先前創建的列表(包含一些重複項)。當然,當我創建集合時,我不想在裏面有任何重複。
HashSet<Person> mySet = new LinkedHashSet<Person>(listOfPeople);
問題: 讓我們假設,在某些情況下,「沒有重複」意味着我「的人以不同的名稱」。在其他情況下「的人不同年齡」等
我看到HashSet
的add
方法使用put
從HashMap
:
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;
}
問: 所以,我明白我應該只需覆蓋equals
,Person
並記得根據我的要求返回相同的hashCode
對象應該「相等」。但是如果我的「平等」術語在運行時發生變化呢?
我在問,因爲在使用Collections.sort
對一個集合進行排序時,我可以指定一個自定義Comparator
,這使得我可以根據具體情況提供比較邏輯。
是否有任何類比機制,或者您知道的解決方案,它使我能夠在運行時決定在創建一組元素時組件是否相等?
我現在唯一的解決方案是在Person類中定義一些靜態Comparator,然後用這個比較器的方式重寫equals方法。然後,通過替換一個比較人,我實際上正在改變等於邏輯......它有道理嗎?
是的,「包裝」關鍵字也在我心中!我認爲是非常複雜。但可能不會。感謝您的提示! –