我正在为一堂课建造一个霍夫曼树。在查看我的可用选项后,我决定采用优先级队列方法。但是,当我尝试运行下面的代码时,我在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是,我的问题是我能够修复我的代码以避免这个转换问题吗?
答案 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);