2012-11-13 39 views
1

由於某些原因,當我添加到優先級隊列中時,它不會按字母順序對我的字符串進行排序,我看不出爲什麼。爲什麼Java中的PriorityBlockingQueue沒有正確排序?

這是增加了的PriorityBlockingQueue代碼:

String toAdd = String.format("%s/%s", directory, s); 
outputData.add(toAdd); 

但我得到的不完全有序輸出(僅適用於第幾行,但你可以看到它不是排序):

../StartingTree/files/abknl/apfmpohgyh/a.class 
../StartingTree/files/abknl/apfmpohgyh/a.java 
../StartingTree/files/abknl/aqybc/aeph.java 
../StartingTree/files/abknl/apfmpohgyh/bnjuxxdi.class 
../StartingTree/files/abknl/bbxudleuf/jlffhq/y/xwjj/dyetqhsch/bpg.class 
../StartingTree/files/abknl/bbxudleuf/mxb/fe/ndmg/axapxuco.html 
../StartingTree/files/abknl/aqybc/atyuojdu.txt 

而且這是預期輸出文件的分類輸出的實際(第一部分):

../StartingTree/files/abknl/apfmpohgyh/a.class 
../StartingTree/files/abknl/apfmpohgyh/a.java 
../StartingTree/files/abknl/apfmpohgyh/bnjuxxdi.class 
../StartingTree/files/abknl/apfmpohgyh/bnjuxxdi.java 
../StartingTree/files/abknl/apfmpohgyh/bsqsq.class 
../StartingTree/files/abknl/apfmpohgyh/bsqsq.java 
../StartingTree/files/abknl/apfmpohgyh/ds.class 
../StartingTree/files/abknl/apfmpohgyh/ds.java 
+0

可能重複的[爲什麼我會得到下面的結果?](http://stackoverflow.com/questions/17726452/why-do-i-get-the-following-result) – Raedwald

回答

5

我suspec你正試圖迭代PriorityBlockingQueue並打印元素。

請注意,優先隊列數據結構(AKA heap)不保證排序 - 它保證頭是最小的,但沒有訂單保證的任何下列節點。

如果你希望你的數據保持排序 - 我建議使用類似ConcurrentSkipListSet(注意它是一個集合 - 因此它不允許重複主題),或維護排序List

如果您想使用PriorityBlockingQueue獲得排序的元素 - 您應該迭代刪除頭並輸出新頭 - 直到優先級隊列耗盡。它將保證有序的輸出。

+0

哦,我在我的頭腦,每一個元素將被完美排序,我不知道它只是最小的頭。我只是用另一種結構,然後寫我自己的代碼插入:) 任何在多線程程序中的數據結構的建議(即,其中多個線程可能會試圖同時訪問我的數據)? –

+0

+1或(CF的javadoc): 「*如果您需要按順序遍歷,請考慮使用'Arrays.sort(pq.toArray())'*。」 – assylias

+0

@Geesh_SO:如果你沒有重複的元素,我建議使用一個'ConcurrentSkipListSet'。查看答案的新版本。 – amit

相關問題