我需要将Java PriorityQueue的某些功能移植到PHP,但我缺乏Java经验。对于我的第一次尝试,我只是根据优先级对列表进行排序,它在某种程度上起作用。插入具有相同优先级的项目时会出现问题。我总是将它们放在所有相同的优先级元素之后,但是它并没有给出与java相同的结果。
然后我试着用字符串来做,用长度来比较,包括Java和PHP替代品。 10个字符串按顺序排列:
"eeny","meeny","miny","moe","catch","the","tiger","by","his","toe"
我的PHP类按长度排序,并在之后放置相同长度的字符串:by,moe,the,his,toe,eeny,miny,meeny,catch,tiger
by,moe,the,his,toe,miny,tiger,meeny,eeny,catch
所以在 5个char字符串之后放置了的4个字符长度字符串。
在我分析了这个之后,我想我发现它是如何工作的,但我不确定。我认为当新项目具有将其放置在队列中某处的优先级时,它将替换已存在的项目,并且该项目将进入队列的末尾,无论其优先级如何。我对吗?如果是的话,那对我来说听起来不合逻辑......
这是我的Java测试代码:
PriorityQueue<String> queue = new PriorityQueue<String>(1,new Comparator<String>(){
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
queue.offer("eeny");
queue.offer("meeny");
queue.offer("miny");
queue.offer("moe");
queue.offer("Catch");
queue.offer("the");
queue.offer("tiger");
queue.offer("By");
queue.offer("his");
queue.offer("toe");
for(int i=1;i<=10;i++) {
System.out.println(queue.remove());
}
由于有4个字符长度的字符串,它们在一起,但按照&#34; moe&#34;,&#34;他的&#34;,&#34; toe&#34; ,&#34;&#34; 既不是FIFO顺序也不是字母顺序。那是为什么?
答案 0 :(得分:0)
好的,我明白了。我只是回答我自己的问题,以供其他人参考。 Java文档说
如果多个元素被绑定为最小值,则头部是其中一个元素 - 关系被任意破坏。
这意味着如果有多个元素具有相同的优先级,那么Java只需将它们按任何顺序放入它们。不是FIFO,不是字母,不是任何东西。这对我来说不太实际或合乎逻辑。无论如何,这意味着在PHP中准确表示这种行为是不可能的,所以我坚持只按优先级排序元素,然后是FIFO。