簡體   English   中英

用Java排序泛型

[英]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中的SortedMapSortedSet實現使用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.

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