[英]Sorting generics in Java
我必須實現一個通用的AVL樹作為作業。 它的定義如下:
public class AVL<Key,Elem>;
問題是我假設在某個時候,我將不得不比較鍵來決定我在節點的哪一側分配元素。 出於此作業的目的,整數將用作鍵。
由於沒有其他限制或信息,因此我首先想到的是假設Key始終是Integer。 但是,這使通用的“密鑰”成為多余,而且我認為這不是老師所期望的。 因此,我認為最好的解決方案包括強制執行Key實現比較器時傳遞的任何內容或類似的東西(我從未真正與Comparator一起工作過,只是猜測),然后使用該比較器比較Key而不是使用==,<,>和!=運算符。 但是,我不知道如何去做。 有什么提示嗎?
提前致謝。
嘗試使用public class AVL<Key extends Comparable<Key>,Elem>;
並使用Comparable<T>
接口所需的並且由Integer
實現的compareTo()
方法。
標准Java API中的SortedMap
和SortedSet
實現使用Comparator<Key>
並調用其compare(k1, k2)
方法,或者假定鍵實現Comparable<Key>
,然后調用k1.compareTo(k2)
。 大多數都提供這兩種方法,具體取決於所使用的構造函數。 (EnumMap / EnumSet不支持,因為它們僅支持按聲明順序對枚舉值進行內置排序。)
Comparable
方法要求必須始終以相同的方式對鍵進行排序,並且將用於具有規范順序(例如整數)的鍵(您要在其中使用此順序)。
Comparator
方法更加靈活,因為您可以將相同的鍵對象用於順序不同的不同地圖,並且可以將其用於無法控制或沒有規范順序的鍵(例如List) ,樹/圖形等。您還可以使用它使用整理器(這是實現Comparator的類),按照除純unicode值(例如,基於語言環境)之外的其他條件對字符串鍵進行排序。
兩者都需要對鍵進行總排序,但是我想這對於您的AVL樹也是必需的。
這是一個Comparator實現,可在任何可比較的對象上使用,因此(可以在內部)將其用作Comparable變體的適配器。
public static <X extends Comparable<X>> Comparator<X> makeComparator() {
return new Comparator<X>() {
public int compare(X left, X right) {
return left.compareTo(right);
}
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.