[英]Java TreeSet remove duplicates based on object attribute
我希望使用TreeSet
根據屬性刪除重復的 object (這里是返回對象名稱的toString()
),這是我的代碼:
Set<Object> s = new TreeSet<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
if (o1.toString().equals(o2.toString())) {
return 0;
} else {
return 1;
}
}
});
s.addAll(listComCopy);
listComCopy.clear();
listComCopy.addAll(s);
listComCopy
是 object 的列表。
它可以工作,但它只比較列表中的連續對象,所以如果我有list(50).equals(list(150))
它將忽略。
您是否知道如何重構此代碼以消除所有重復項,無論它們在列表中的順序如何?
根據TreeSet的構造函數javadoc :
TreeSet(比較器比較器)
構造一個新的空樹集, 該樹集根據指定的比較器進行排序 。
您提供的比較器僅用於排序,而不用於重復刪除。
如果要刪除重復項,則應在要存儲在此TreeSet上的對象類上實現.equals()
和.hashcode()
,因此在向其中添加新元素時,重復項刪除邏輯將立即可用。
您的compare
方法不符合要求。
請參閱Comparator.compare ...
比較其兩個參數的順序。 當第一個參數小於 ,等於或大於第二個參數時,返回負整數 ,零或正整數。
您最好在compare
使用String.compareTo 。
Set<Object> s = new TreeSet<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
});
您可能想使用compareTo方法而不是equals方法來比較字符串。 這將允許樹集構建實際的樹狀結構。
您應該重新考慮Comparator
實現。 從java.util.Comparator#compare
javadoc:
@返回負整數,零或正整數,因為第一個參數小於,等於或大於第二個參數。
您永遠不會在代碼中返回負數,請考慮return o1.toString().compareTo(o2.toString())
作為您的Comparator
實現
TreeSet 似乎沒有在元素 class 上使用 equals 和 hashCode ,因為 HashSet 用於其重復刪除。 相反,它使用排序列表來消除重復項。 為了獲得預期的效果(重復刪除),應該確保完美地執行比較器的比較。 在這種情況下,將 "if (o1.toString().equals(o2.toString())) { return 0; } else { return 1; }" 替換為 "o1.toString().compareTo(o2.toString() )" 應該解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.