簡體   English   中英

對象從Java TreeSet中消失

[英]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是每個實例的優先級都與所有其他實例的優先級不同,因此對於每對元素AB ,正好其中一個保持: A == BA.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM