在不可比较的对象上使用优先级队列,其中包含可比较的对象

时间:2012-10-10 07:06:30

标签: java priority-queue comparable huffman-code

我正在为一堂课建造一个霍夫曼树。在查看我的可用选项后,我决定采用优先级队列方法。但是,当我尝试运行下面的代码时,我在TreeNode上获得了一个ClassCastException(在第一个pq.offer行上)。

public static TreeNode<CharFreq> buildTree(ArrayList<TreeNode<CharFreq>> trees) throws IOException {

   PriorityQueue<TreeNode<CharFreq>> pq = new PriorityQueue<TreeNode<CharFreq>>();

   for (int i = 0; i < trees.size(); i++) {
     if (trees.get(i).getItem().getFreq() > 0) {
       pq.offer(new TreeNode<CharFreq>(new CharFreq(trees.get(i).getItem().getChar(), trees.get(i).getItem().getFreq())));
     }
   }  

   while (pq.size() > 1) {    
       TreeNode<CharFreq> leftNode = pq.poll();
       TreeNode<CharFreq> rightNode = pq.poll();
       TreeNode<CharFreq> parentNode = new TreeNode<CharFreq>(new CharFreq('\u0000', ((leftNode.getItem().getFreq()) + (rightNode.getItem().getFreq()))), leftNode, rightNode);
   }  

   return pq.poll();

}

我知道它不是一个类似的类,但是,CharFreq是,我的问题是我能够修复我的代码以避免这个转换问题吗?

2 个答案:

答案 0 :(得分:1)

您可以创建自定义比较器:Comparator<TreeNode<CharFreq>>并在创建PriorityQueue时使用它:

http://docs.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html#PriorityQueue(int,java.util.Comparator)

  

创建具有指定初始容量的PriorityQueue,该容量根据指定的比较器

对其元素进行排序

使用anonymous class概念,您可以拥有如下代码:

public static TreeNode<CharFreq> buildTree(ArrayList<TreeNode<CharFreq>> trees)
    throws IOException {
    Comparator<TreeNode<CharFreq>> comparator = new Comparator<TreeNode<CharFreq>>() {

        //basic implementation, you must use your own!
        public int compare(TreeNode<CharFreq> node1, TreeNode<CharFreq> node2) {
            return node1.data.compareTo(node2.data);
        }
    };
    PriorityQueue<TreeNode<CharFreq>> pq = new PriorityQueue<TreeNode<CharFreq>>(10, comparator);
    //the rest of your code...
}

请注意,使用这种方式意味着您每次需要创建Comparator<TreeNode<YourClass>>时都必须创建自定义PriorityQueue<TreeNode<YourClass>>

答案 1 :(得分:0)

优先级队列使用Comparator(在构造函数中提供)或直接将对象强制转换为Comparable

为了避免ClassCastException,您应该提供Comparator TreeNode。这样队列将使用比较器而不是转换。

PriorityQueue<TreeNode<CharFreq>> pq = new PriorityQueue<TreeNode<CharFreq>>(initialCapacity, comparator);