[英]Objects disappearing from Java TreeSet
我有一個要放入TreeSet
的類,該類實現Comparable
來按優先級對它們進行排序。 這是一小段:
public abstract class PacketListener implements Comparable<PacketListener> {
public enum ListenerPriority {
LOWEST, LOW, NORMAL, HIGH, HIGHEST
}
private final ListenerPriority priority; // Initialized in constructor
// ... class body ...
@Override
public final int compareTo(PacketListener o) {
return priority.compareTo(o.priority);
}
}
顯然,這個想法是讓TreeSet
按優先級對對象進行排序的,這使我可以按順序遍歷偵聽器。 但是,我發現由於某種原因,我無法將第二個PacketListener
添加到set對象。 添加兩個不同的PacketListener
對象后,集合的大小保持為1。
我不應該使用TreeSet
嗎?
TreeSet
的API文檔包含以下重要信息:
請注意,如果要正確實現
Set
接口,則由集合(無論是否提供顯式比較器)維護的順序必須等於equals 。 [...]之所以如此,是因為Set
接口是根據equals
操作定義的,但是TreeSet
實例使用其compareTo
(或compare
)方法執行所有元素比較,因此,被該方法視為相等的兩個元素是:從集合的角度來看,相等。
換句話說, TreeSet
可以容納您的PacketListener
類的多個實例,但PacketListener
是每個實例的優先級都與所有其他實例的優先級不同,因此對於每對元素A和B ,正好其中一個保持: A == B
或A.compareTo(B) != 0
。
如果必須在同一集合中容納多個具有相同優先級的PacketListener
實例,則需要不同類型的集合。 HashSet
非常適合使用從Object
繼承的equals()
和hashCode()
方法的類,前提是確實具有所需的實例相等性。 你也可以考慮LinkedHashSet
如果你想要某種關於迭代順序,或者一個保證的PriorityQueue
,如果你想通過優先順序,但你願意用不同的機制來避免重復。
TreeSet
將兩個對象,其compareTo
返回0等於。 這意味着在當前實現的樹集中,永遠不會有兩個優先級相同的對象。
解決問題的方法是使compareTo
方法考慮您關心的所有值(即,僅實際上相等的對象返回0)。
一Set
是唯一元素的集合。 當您使用優先級比較PacketListener
,我假設TreeSet
中最多有五個實例,每個優先級一個。
如果結構允許,您可以找到一個輔助密鑰來比較PacketListener
,以防它們具有相同的優先級。 如果不能,那么TreeSet
是錯誤的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.