2015-01-09 38 views
2

我想在其節點中使用鍵值對生成二叉樹。比較兩個通用對象,如果它們是「更大」或「更小」

在我的二叉樹中,我想用一個insert方法開始實現節點,該方法在關鍵字小於當前節點的關鍵字時實現一個新的左節點。那麼如果已經有一個左節點,它會再次檢查它。右/更大的節點插入遵循相同的邏輯。

我使用int類型首先編寫我的代碼,因爲在我使用泛型(我的新主題)之前,測試我的代碼更方便。它在使用int時有效,但我不確定如何通過使用「<」或「>」來比較兩種泛型。

public ListCell<Type> checkKey(Type key, ListCell<Type> checkCell) { 
    ListCell<Type> newCell = null; 
    if (key < checkCell.key && checkCell.left != null) { 
     ... 
    } 
    ... 
} 

我不知道是否值得說,但我正在用自編碼列表創建我的二叉樹。 上面你可以看到我目前的支票,但我無法將我的給定密鑰與checkCell.key進行比較,因爲它們不是數字。

所以我的一般問題是如何比較泛型中的鍵,如果它們比我在二叉樹中實現的「更小」或「更大」。

在此先感謝

+0

當你說「結」,你的意思「節點'? – 2015-01-09 18:37:37

+0

如果節點是二叉樹的元素,那麼是:D抱歉 編輯:改變了它 – NhatNienne 2015-01-09 19:56:34

回答

7

你需要確保你的泛型類型實現的Comparable接口,然後用compareTo方法來代替。 Java不支持重載>運算符(或者任何運算符重載,就此而言)。

作爲每the documentscompareTo

與此對象比指定的對象小於,等於,或大於,則返回一個負整數,零或正整數。

一個例子(你必須要在映射到您確切的代碼),假設key是你的項目,你會在你的節點存儲,並且checkCell.key是您的節點

int compareResult = key.compareTo(checkCell.key); 
if (key < 0) { // it goes on the left } 
else if (key == 0) { // it is the same } 
else { // it goes on the right } 

在你compareTo您需要決定您班級中的哪些字段確定它是「排序」。舉例來說,如果你有一個sizepriority場,你可以做:

@Override public int compareTo(Type other) { 
    final int BEFORE = -1; 
    final int EQUAL = 0; 
    final int AFTER = 1; 

    if (this == other) return EQUAL; 

    if (this.size < other.size) return BEFORE; 
    else if (this.size > other.size) return AFTER; 
    else { // size is equal, so test priority 
    if (this.priority < other.priority) return BEFORE; 
    else if (this.priority > other.priority) return AFTER; 
    } 
    return EQUAL; 
} 
+0

但我需要重寫它,我是對嗎? 我已經實現了可比較的接口,但不知道如何正確使用compareTo(請閱讀oracle.com上的文檔) – NhatNienne 2015-01-09 19:56:06

+0

,並實現了一個遵從文檔規則的有意義的'compareTo'。現在,如果'newItem.compareTo(node)'是'-1,0或1',那麼'newItem'是:小於(放在左邊);等於;或者大於(放在右邊)「節點」(按照該順序)。 – 2015-01-09 20:05:22

+0

但我怎麼能比較我的項目正確的節點?如果密鑰小於,等於或大於比較節點的密鑰,如何檢查我的compareTo方法?等於可以用等號方法完成?但我不知道如何做更小或更大的..你能給我一個提示嗎? – NhatNienne 2015-01-09 20:56:37

2

限制類型參數的關鍵是通用算法的實現。考慮下面的方法,它計算數組T []中大於指定元素elem的元素數。

public static <T> int countGreaterThan(T[] anArray, T elem) { 
    int count = 0; 
    for (T e : anArray) 
     if (e > elem) // compiler error 
      ++count; 
    return count; 
} 

該方法的實現是簡單的,但它不編譯,因爲大於運算符(>)僅適用於原語類型,如短型,整型,雙,長整型,浮點,字節,和炭。您不能使用>運算符來比較對象。要解決此問題,使用由Comparable<T>接口約束類型參數:

public interface Comparable<T> { 
    public int compareTo(T o); 
} 

產生的代碼將是:

public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { 
    int count = 0; 
    for (T e : anArray) 
     if (e.compareTo(elem) > 0) 
      ++count; 
    return count; 
} 

bounded type parameters

+1

這似乎是一個比其他張貼更好的答案。 – FistOfFury 2016-12-09 16:31:51