2012-11-13 38 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

相关问题