2012-06-15 33 views
0
import java.util.*; 
    class Huffman { 
     int a; 
     public Huffman(int i) 
     { 
      a = i; 
     }    
    } 

    class PriorityQueueDemo implements Comparator<Huffman> 
    { 
     public int compare(Huffman ab, Huffman cd) 
     { 
      if(ab.a>cd.a) 
      { 
       return 1; 

      } 
      return 0; 
     } 

     public static void main(String[] args) 
     { 
      PriorityQueue<Huffman> HuffQueue = new PriorityQueue<Huffman>(); 

      Huffman ab = new Huffman(10); 
      HuffQueue.offer(ab); 
      ab = new Huffman(50); 
      HuffQueue.offer(ab); 
      ab = new Huffman(20); 
      HuffQueue.offer(ab); 
      ab = new Huffman(60); 
      HuffQueue.offer(ab); 


      while(HuffQueue.size() > 0) 
        System.out.println(HuffQueue.remove()); 

      } 
    } 

有什麼不對下面的代碼!它生成以下例外以下Java代碼中的錯誤是什麼?

Exception in thread "main" java.lang.ClassCastException: Huffman cannot be cast to java.lang.Comparable 
    at java.util.PriorityQueue.siftUpComparable(Unknown Source) 
    at java.util.PriorityQueue.siftUp(Unknown Source) 
    at java.util.PriorityQueue.offer(Unknown Source) 
    at PriorityQueueDemo.main(Huffman.java:34) 

回答

4

您需要實現Comparable接口

優先級隊列依靠自然順序也不允許不可比較的對象的插入(這樣做可能導致ClassCastException異常)。

或者你需要通過比較在構造

public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)

像如下

PriorityQueue<Huffman> HuffQueue = new PriorityQueue<Huffman>(10, new Comparator<Huffman>(){ 

@Override 
public int compare(Huffman ab, Huffman cd){ 
      if(ab.a>cd.a) 
      { 
       return 1; 

      } 
      return 0; 
} 
}); 
+0

非常感謝。它現在正在工作,但它的打印順序並不像優先級隊列那樣。它的輸出與插入的順序相同。它有什麼問題? – Sarfraz

+0

以檢查它的'比較()'方法 –

+0

歡迎您:) –

0

異常狀態Hufmann類不是Comparable,沒有實現java.util.Comparable,所要求的PriorityQueue。執行ComparableHuffman爲了可比較並獲得適當的優先級隊列。在http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html中解釋了Comparable,並且需要compareTo(T o) : int方法實現。

+0

如果(ab.a> cd.a) { 回報1; } return 0; 當我替換此代碼: 返回ab.a-cd.a; 它的工作!我從這裏理解的是,它比較期望+ ve或-ve值。如果第一個參數(即將要比較的值已存在的元素:遞歸地)大於傳遞的值,則在此情況下它是正確的順序,它返回一些-ve值。如果需要交換,它應該返回+ ve值。 – Sarfraz