0

現在、クラスのハフマンツリーを作成しています。使用可能なオプションを確認した後、優先キュー方式を採用することにしました。ただし、以下のコードを実行しようとすると、TreeNode(最初のpq.offer行)でClassCastExceptionが発生します。

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は同等です。私の質問は、このキャストの問題を回避するようにコードを修正できるかどうかです。

4

2 に答える 2

1

カスタムコンパレータを作成できます:Comparator<TreeNode<CharFreq>>そしてPriorityQueueを作成するときにそれを使用します:

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

指定されたコンパレータに従って要素を順序付ける、指定された初期容量でPriorityQueueを作成します

匿名クラスの概念を使用すると、次のようなコードを作成できます。

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>>

于 2012-10-10T07:17:32.623 に答える
0

優先度付きキューは、Comparator(コンストラクターで提供される)を使用しているか、オブジェクトをに直接キャストしますComparable

ClassCastExceptionを回避するには、のを指定する必要がありComparatorますTreeNode。このように、キューはキャストする代わりにコンパレータを使用します。

PriorityQueue<TreeNode<CharFreq>> pq = new PriorityQueue<TreeNode<CharFreq>>(initialCapacity, comparator);
于 2012-10-10T07:11:16.180 に答える