2015-01-06 24 views
10

私は優先順位が最も低い周波数を持つノードを使用してJavaでプライオリティキューを作成しようとしています。しかし、私のコンパレータは動作しておらず、出力は非常に奇妙です。私は私のコンパレータを変更する必要があると思うが、私はそれをどのように変更するか分からない。ここ は私のコードである:PriorityQueue.toString間違った要素の順序

public class HuffmanComparator implements Comparator<TreeNodeHuffman> { 
    public int compare(TreeNodeHuffman p1, TreeNodeHuffman p2) { 
     if (p1.frequency < p2.frequency) return -1; 
     if (p1.frequency > p2.frequency) return 1; 
     return 0; 
    }  
} 

public class TreeNodeHuffman { 
public static void main(String[] args) {  
    HuffmanComparator compare = new HuffmanComparator(); 
    TreeNodeHuffman e = new TreeNodeHuffman('e', 12702); 
    TreeNodeHuffman t = new TreeNodeHuffman('t', 9056); 
    TreeNodeHuffman a = new TreeNodeHuffman('a', 8167); 
    TreeNodeHuffman o = new TreeNodeHuffman('o', 7507); 
    TreeNodeHuffman i = new TreeNodeHuffman('i', 6966); 
    TreeNodeHuffman n = new TreeNodeHuffman('a', 6749); 
    TreeNodeHuffman s = new TreeNodeHuffman('s', 6327); 
    TreeNodeHuffman h = new TreeNodeHuffman('h', 6094); 
    TreeNodeHuffman r = new TreeNodeHuffman('r', 5987); 
    TreeNodeHuffman d = new TreeNodeHuffman('d', 4253); 
    TreeNodeHuffman l = new TreeNodeHuffman('l', 4025); 
    TreeNodeHuffman c = new TreeNodeHuffman('c', 2782); 
    TreeNodeHuffman u = new TreeNodeHuffman('u', 2758); 
    TreeNodeHuffman m = new TreeNodeHuffman('m', 2406); 
    TreeNodeHuffman w = new TreeNodeHuffman('w', 2360); 
    TreeNodeHuffman f = new TreeNodeHuffman('f', 2228); 
    TreeNodeHuffman g = new TreeNodeHuffman('g', 2015); 
    TreeNodeHuffman y = new TreeNodeHuffman('y', 1974); 
    TreeNodeHuffman p = new TreeNodeHuffman('p', 1929); 
    TreeNodeHuffman b = new TreeNodeHuffman('b', 1492); 
    TreeNodeHuffman v = new TreeNodeHuffman('v', 978); 
    TreeNodeHuffman k = new TreeNodeHuffman('k', 772); 
    TreeNodeHuffman j = new TreeNodeHuffman('j', 153); 
    TreeNodeHuffman x = new TreeNodeHuffman('x', 150); 
    TreeNodeHuffman q = new TreeNodeHuffman('q', 95); 
    TreeNodeHuffman z = new TreeNodeHuffman('z', 74); 
    PriorityQueue<TreeNodeHuffman> queue = new PriorityQueue<TreeNodeHuffman>(26, compare); 
    queue.add(e); 
    queue.add(t); 
    queue.add(a); 
    queue.add(o); 
    queue.add(i); 
    queue.add(n); 
    queue.add(s); 
    queue.add(h); 
    queue.add(r); 
    queue.add(d); 
    queue.add(l); 
    queue.add(c); 
    queue.add(u); 
    queue.add(m); 
    queue.add(w); 
    queue.add(f); 
    queue.add(g); 
    queue.add(y); 
    queue.add(p); 
    queue.add(b); 
    queue.add(v); 
    queue.add(k); 
    queue.add(j); 
    queue.add(x); 
    queue.add(q); 
    queue.add(z); 
    System.out.println(queue); 
} 
} 

次のように出力される。 [Z、K、Q、G、V、X、U、D、F、Y、B、M、J、I、C 、e、s、o、w、a、r、h、p、t、l、a] しかし、出力は[z、q、x、j、k、v、b .......]でなければなりません。 ありがとうございます!あなたはとても高く行くために低周波たい

+3

@LuiggiMendoza: 'toString'は、すべてのオブジェクトを表示するためにイテレータを使用しています。それはトラバーサルの順序で要素を印刷する必要がありますので、私はAbstractCollectionのコードで表示されるものと – njzk2

+1

@LuiggiMendozaは、のtoStringは、イテレータを使用しています。これはPriorityQueueで使用されるtoStringの実装です(少なくともJava 6では)。 – Eran

+3

Docは次のように言っています: 'メソッドiterator()で提供されるイテレータは、優先順位キューの要素を特定の順序でトラバースすることは保証されていません。 ' – njzk2

答えて

20

あなたは一つPriorityQueue 1からアイテムをポーリングする必要があります。 toStringはそうしていません。

だからではなく、あなたのSystem.out.println(queue);は、次の操作を行います。

while(!queue.isEmpty()) { 
    System.out.println(queue.poll()); 
} 

理由は、ヒープは詳細についてはどのように動作するかのルックアップ、PriorityQueueは完全に内部的にソートされることはありませんということです。それからのポーリング項目は呼び出し中にヒープを修正するので、要素をソート順に出力する必要があります。

1

:あなたはそれをテストしたい場合は

public int compare(TreeNodeHuffman p1, TreeNodeHuffman p2) { 
      if (p1.frequency < p2.frequency) return 1; 
      if (p1.frequency > p2.frequency) return -1; 
      return 0; 
     }  
    } 

を、シングルスレッドのプールに送信し、代わりに文字列またはイテレータの処理中のジョブの順序を参照してください。 docで言う通りhttp://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#iterator%28%29

このキューの要素のイテレータを返します。イテレータは特定の順序で要素を返しません。

これをテストする簡単なシングルスレッドプールのhttp://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor%28%29を見ることができます。

4

System.out.println(queue)はソートされていないキューを印刷しています。印刷したい場合は、キュー本当の順序は下へ、キュー先頭から要素を取得するためにポーリングを使用して、以下のコードは、次のとおりです。

TreeNodeHuffman tn = null; 
    do{ 
     tn = queue.poll(); 
     if(tn!=null){ 
      System.out.print(tn.key+","); 
     } 
    }while(tn != null); 

を、あなたは予想通り、この出力を参照しなければならない。

Zをq、x、j、k、v、b、p、y、g、f、w、m、u、c、l、d、r、h、s、a、i、o、a、t、e 、

関連する問題