2011-04-22 87 views
0

對於我的數據結構類,我們的作業是創建一個通用堆ADT。在siftUp()方法中,我需要做比較,如果父項較小,我需要進行交換。我遇到的問題是比較運算符在泛型類型上無效。我相信我需要使用Comparable接口,但根據我的理解,使用數組不是一個好主意。我也搜索這個網站,我發現關於這個職位沒有人幫我找到解決方案泛型堆中的比較運算符

我刪除了一些代碼,這是不相關的有用信息 感謝

public class HeapQueue<E> implements Cloneable { 
    private int highest; 
    private Integer manyItems; 
    private E[] data; 

    public HeapQueue(int a_highest) { 
     data = (E[]) new Object[10]; 
     highest = a_highest; 

    } 

    public void add(E item, int priority) { 
     // check to see is priority value is within range 
     if(priority < 0 || priority > highest) { 
     throw new IllegalArgumentException 
      ("Priority value is out of range: " + priority); 
     }  
     // increase the heaps capacity if array is out of space 
     if(manyItems == data.length) 
     ensureCapacity(); 
     manyItems++; 
     data[manyItems - 1] = item; 
     siftUp(manyItems - 1); 
    } 

    private void siftUp(int nodeIndex) { 
     int parentIndex; 
     E tmp; 
     if (nodeIndex != 0) { 
      parentIndex = parent(nodeIndex); 
      if (data[parentIndex] < data[nodeIndex]) { <-- problem **** 
        tmp = data[parentIndex]; 
        data[parentIndex] = data[nodeIndex]; 
        data[nodeIndex] = tmp; 
        siftUp(parentIndex); 
      } 
     } 
     } 

    private int parent(int nodeIndex) { 
     return (nodeIndex - 1)/2; 
    } 
} 

回答

0

如果我讀這一權利,E只是需要延長Comparable,然後你的問題行成爲...

if (data[parentIndex].compareTo(ata[nodeIndex]) < 0) 

這沒有違反任何賭注做法規則,我知道的。

+0

當我在Comparable上擴展E時,我在構造函數 data =(E [])new Object [10]中得到了一個轉換錯誤; [Ljava.lang.Object;不能轉換爲[Ljava.lang.Comparable; class HeapQueue > – Chad 2011-04-22 02:04:50

+0

@Char:只需改用ArrayList 即可。 – 2011-04-22 11:40:21

+0

我想出了鑄造錯誤......我忘了將Object更改爲類型Comparable。感謝您的幫助 – Chad 2011-04-22 17:00:13

1

技術上您在項目上使用可比較的接口,而不是數組。數組中的一個項目具體。我認爲最好的解決方案是在構造函數中接受一個Comparator,用戶可以通過它來比較其通用對象。

Comparator<E> comparator; 
public HeapQueue(int a_highest, Comparator<E> compare) 
{ 
    this.comparator = compare; 

然後,你會是比較存儲在一個成員函數,並使用

if (comparator.compare(data[parentIndex],data[nodeIndex]) < 0) 

在地方的運營商相比少。

+0

我以前沒有使用比較器,如何將它添加到構造函數中?謝謝 – Chad 2011-04-22 02:06:41

+0

在示例中編輯 – Ben 2011-04-22 02:09:51