2012-06-15 66 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