Java PriorityQueue не опрашивает ожидаемый объект

Это мой первый пост здесь, поэтому не стесняйтесь указывать мне правильное направление в формулировке вопроса здесь.

Моя проблема связана с java.util.PriorityQueue.

У меня есть очередь, которую я инициализирую;

    myComparable comp = new myComparable();

    PriorityQueue<someObject> prioritized = new PriorityQueue<someObject>(11, comp);

Я не думаю, что это имеет значение для вопроса, что находится в моей очереди или как реализован myComparable.

Затем я получаю неожиданный вывод:

prioritizedObject = prioritized.poll();

for(someObject otherObject : prioritized)
{
    System.out.println(comp.compare(prioritizedObject, otherObject));
    System.out.println(comp.equals(prioritizedObject, otherObject));

}

Для одного объекта в списке выводится:
1
false

Как это может быть? Как я могу опросить () объект из очереди, в то время как компаратор, который я использую, говорит, что другой объект в очереди меньше?


person Hanna    schedule 20.01.2011    source источник
comment
Я не думаю, что это как-то связано с очередью. Это ваш метод Comparable, который работает неправильно. Ваша очередь получает только все объекты. Есть только один, так что это, кажется, не он. Вы выполнили модульные тесты для своего класса myComparable?   -  person Marnix    schedule 20.01.2011
comment
Это действительно невозможно сказать, не видя больше кода. Можете ли вы опубликовать SSCCE, демонстрирующий это?   -  person Bart Kiers    schedule 20.01.2011
comment
Я не думаю, что это имеет значение для вопроса, что находится в моей очереди или как реализован myComparable. -- Как вы можете так говорить, если не знаете, почему ваш код не работает? Поистине удивительно.   -  person Hovercraft Full Of Eels    schedule 20.01.2011
comment
Что я имею в виду, исходя из моего базового уровня понимания, если мой компаратор возвращает 1 при сравнении объекта A и объекта B, тогда объект B всегда должен опрашиваться перед объектом A, однако мой компаратор реализован? Сравнение идет сразу после опроса(), так что здесь ничего не могло измениться, верно?   -  person Hanna    schedule 20.01.2011
comment
Компаратор ничего не делает с приоритетом очереди. Он просто сравнивает ваши объекты A и B. Значит, в очереди есть и другие объекты с более высоким приоритетом?   -  person Marnix    schedule 20.01.2011


Ответы (1)


В случае, если все остальное в порядке (нет одновременных пушей, отсутствие ошибок в тесте), я могу предположить две причины:

  • объекты изменяются таким образом, что это влияет на их порядок (запрещено)
  • компаратор неправильный (не транзитивный или что-то еще)
person maaartinus    schedule 20.01.2011
comment
Основываясь на очень коротком примере кода, который у вас есть здесь - я предполагаю, что второй вариант маартинуса, вероятно, то, что нужно - опубликуйте компаратор. - person lscoughlin; 20.01.2011
comment
Да, извините, я думал, что если A ‹ B, то A всегда будет опрашиваться перед B, но у меня есть некоторая двусмысленность в очереди, которая, я думаю, допускает A ‹ B, B ‹ C, C ‹ A, что, конечно, позволит чтобы B был опрошен раньше, чем A. Всем спасибо! - person Hanna; 20.01.2011