Почему я могу видеть элементы PriorityQueue с Iterator, но не с опросом?

У меня есть следующий код Java, который создает PriorityQueue и добавляет к нему некоторые элементы:

public class Main {
 public static void main(String[] args) {
 PrintWriter out = new PrintWriter(System.out);
 PriorityQueue<integer> q = new PriorityQueue<>();

 Integer[] integers = new Integer[10];
 Integer[] integers1 = new Integer[10];
 for (int i = 0; i < 10; i++) {
 integers[i] = i;
 integers1[i] = i + 10;
 }


 for (int i = 0; i < integers.length; i++) {
 q.add(integers[i]);
 q.add(integers1[i]);
 }

 out.println(q.size());

 for(int i = 0; i < integers.length; i++)
 out.println(q.poll());

 out.close();
 } 
}
</integer>

В этом сегменте кода q.size() возвращает размер очереди, q.size() 20. Однако, когда я извлекаю элементы, используя функцию poll() в последнем цикле, он извлекает только первые 10 элементов. Однако, когда я использую Iterator для доступа к элементам, он извлекает все элементы из очереди. Кажется, что метод poll() всегда извлекает половину элементов в очереди.

Что здесь происходит?

3 ответа

Здесь ваш цикл for имеет неправильные границы:

for(int i = 0; i < integers.length; i++)
 out.println(q.poll());

Вы добавили integers.length + integers1.length элементы в очередь приоритетов, но вы всего лишь цикл integers.length раз. Попробуйте изменить это, чтобы использовать цикл while:

while (!q.isEmpty())
 out.println(q.poll());

Надеюсь это поможет!


Вы добавляете 20 элементов:

10
 _____________
 / \
for (int i = 0; i < integers.length; i++) {
 q.add(integers[i]); \________________ x 2
 q.add(integers1[i]); /
}

Но вы получаете только 10 элементов:

10
 _____________
 / \
for(int i = 0; i < integers.length; i++)
 out.println(q.poll()); ------------ x 1

Чтобы полностью выгрузить очередь приоритетов, выполните следующие действия:

while (!q.isEmpty())
 out.println(q.poll());


Поскольку integers.length равно 10. Это условие break в вашем последнем for-statement.

licensed under cc by-sa 3.0 with attribution.