@thatmaniscool

PriorityQueue сортируется по приоритету, как исправить?

Имею простой класс:
public class User {
	private String name;
	private int ID;
	
	public  User (String name, int ID) {
		this.name = name;
		this.ID = ID;
	}
	
	
	public int GetID () {
		return ID;
	}
	
	
	public String toString () {
		return name + " : " + ID;
	}
}

Создаю главный класс, где задаю параметры приоритета для очереди.
public class Main <T>  {
	public static void main (String [] args) {
		Queue <User> queue = new PriorityQueue <User> (10, new Comparator <User> () {

			@Override
			public int compare(User o1, User o2) {
				// TODO Auto-generated method stub
				return (o1.GetID() - o2.GetID());
			}
			
		});
		
		
		queue.add(new User ("Example", 10));
		queue.add(new User("Example", 3));
		queue.add(new User("Example", 1));
		queue.add(new User("Example", 5));
		queue.add(new User ("Example", 7));
		
		queue.stream().forEach(System.out::println);
	}
}

На выходе
Example : 1
Example : 5
Example : 3
Example : 10
Example : 7

Не могу найти причину, почему не сортируется.
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
PriorityQueue - это куча, а потому она не гарантирует порядок при обходе, только порядок при извлечении элемента:
while (!queue.isEmpty()) {
    System.out.println(queue.poll());
}

P.S. Так queue.stream().forEach(System.out::println); делать не надо вообще никогда и ни с какими структурами данных.
P.P.S. Почитайте Java Style Guide.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Потому что метод stream() так же как iterator() не гарантирует траверс в порядке очереди. Метод poll для этого есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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