Java: PriorityQueue возвращая неправильное упорядочивание из пользовательского компаратора? [дубликат]

5
задан Michael Simpson 15 June 2010 в 19:50
поделиться

2 ответа

Как вы распечатываете эти значения? Я не думаю, что итератор из PriorityQueue обеспечивает те же гарантии упорядочения, что и весь класс, поэтому потенциально, если вы выполняете

for(Node n : queue) {
System.out.println(n.getF());
}

, вы получите неупорядоченный вывод. Гарантия упорядочения применяется только к offer , take , poll , peek и, возможно, некоторым другим методам.

Итератор специально упоминается в документации javadoc для очереди с приоритетом http://java.sun.com/javase/6/docs/api/java/util/PriorityQueue.html

10
ответ дан 18 December 2019 в 13:11
поделиться

Не знаю, что не так с вашим кодом, но у меня это работает:

import java.util.*;
public class Test {
    public static void main(String[] args) {
        PriorityQueue<Node> open = new PriorityQueue<Node>(10,
                new Comparator<Node>() {
            @Override
            public int compare(Node n1, Node n2){
                if (n1.getF() > n2.getF()){
                    return +1;
                }
                else if (n1.getF() < n2.getF()){
                    return -1;
                }
                else {  // equal
                    return 0;
                }
            }
        });

        for (int i = 0; i < 20; i++)
            open.add(new Node());

        while(open.size() > 0) {
            Node t = (Node)(open.remove());
            System.out.println(t.getF());
        }
    }
}

class Node {
    double d = Math.random() * 10;
    public double getF() { return d; }
}

Вывод:

0.21442281608773262
1.9965384843480016
2.6660026888929824
2.888889937975976
3.098932914222398
3.1059072964534638
4.193212975907516
4.296282412431935
4.3241392173963735
4.825876226139123
5.193550353435191
5.637831708672641
5.949759449054407
6.620639629878806
7.505126870725806
7.966337123623846
8.270840212631589
8.484502118941545
8.730910327480023
9.191324325662219

Убедитесь, что getF () случайно не вернет int-версию двойника.


Обновление: вы не можете обновить данные, которые определяют порядок элементов после вставки. В этом случае вам нужно извлечь элемент, обновить его и снова вставить.

4
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: