2016-11-16 2 views
0

Мне нужно перенести некоторые функции Java PriorityQueue в PHP, но я неопытен в Java. Для моей первой попытки я просто отсортировал список по приоритету, и он работает в некоторой степени. Проблема возникает, когда вставлены элементы с одинаковым приоритетом. Я всегда ставил их ПОСЛЕ всех одинаковых элементов приоритета, но это не давало равных результатов с java.Представление Java Priorotyqueue в PHP

Затем я попытался сделать это со строками по сравнению с длиной, как на 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 полукокса, они вместе, но в порядке «moe», «his», «toe», «the», который не является ни порядком FIFO, ни алфавитом. Почему это?

+0

Возможно, это поможет: http://php.net/manual/en/class.splpriorityqueue.php – JustOnUnderMillions

+0

И этот «meeny, eeny' объяснил java? Не получайте здесь сортировку? – JustOnUnderMillions

+0

Я сравнивал строки по их длине, а не в алфавитном порядке, поэтому eeny, который состоит из 4 символов, должен был прийти до meeny, что равно 5 – Moha

ответ

0

Хорошо, я понял. Я просто отвечаю на свой вопрос для справки для других. Java документация говорит

Если несколько элементов привязаны к наименьшему значению, голова одна из этих элементов - связи разрываются произвольно.

Это означает, что если имеется несколько элементов с одинаковым приоритетом, тогда Java просто ставит их в любой желаемый порядок. Не FIFO, а не в алфавитном порядке, не что иное. Это не очень практично или логично для меня. В любом случае, это означает, что НЕВОЗМОЖНО точно представлять это поведение в PHP, поэтому я буду придерживаться только упорядочения элементов по приоритету, а затем FIFO.