Мне нужно перенести некоторые функции 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
Тем не менее, Java дал некоторый «беспокойный» заказ:
by,moe,the,his,toe,miny,tiger,meeny,eeny,catch
Итак, 4 строки длины символа размещены после 5 строк символов
После того, как я проанализировал это, я думаю, что узнал, как это работает, но я не уверен. Я думаю, что когда новый элемент имеет приоритет, который поместил бы его где-то в очереди, он заменит уже существующий элемент, и этот элемент отправляется в конец очереди, независимо от его приоритета. Я прав? Если да, это звучит не слишком логично для меня …
Вот мой тестовый код 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());
}
Поскольку есть четыре строки длиной 3 символа, они вместе, но в порядке «МОС», «его», «схождение», «в» что не является ни порядком FIFO, ни алфавитным. Это почему?
Хорошо, я понял это. Я просто отвечаю на свой вопрос для справки для других.
Java документация говорит
Если несколько элементов связаны по наименьшему значению, один из этих элементов является заголовком — связи нарушаются произвольно.
Это означает, что если есть несколько элементов с одинаковым приоритетом, то Java просто размещает их в любом порядке. Не FIFO, не по алфавиту, не что-нибудь. Это не очень практично или логично для меня. В любом случае, это означает, что НЕВОЗМОЖНО точно представлять это поведение в PHP, поэтому я буду придерживаться простого упорядочивания элементов по приоритету, а затем FIFO.
Других решений пока нет …