2016-10-09 4 views
0

это, вероятно, действительно тривиальный вопрос, но как вы добавляете несколько HashSets в PriorityQueue?Java: Как добавить MULTIPLE HashSets в PriorityQueue?

Я попытался это:

 PriorityQueue<HashSet<Integer>> priorityQueue = new PriorityQueue<HashSet<Integer>>(); 

     priorityQueue.add(new HashSet<Integer>()); 
     priorityQueue.add(new HashSet<Integer>()); 

     System.out.println(priorityQueue.size()); 

и это:

PriorityQueue<HashSet<Integer>> priorityQueue = new PriorityQueue<HashSet<Integer>>(); 

    for (int i = 0; i < 81; i++) { 
    priorityQueue.add(new HashSet<Integer>()); 
    } 

, но я получаю сообщение об ошибке, что говорит HashSet не может быть приведен к сопоставимому:

Exception in thread "main" java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.Comparable 
    at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652) 
    at java.util.PriorityQueue.siftUp(PriorityQueue.java:647) 
    at java.util.PriorityQueue.offer(PriorityQueue.java:344) 
    at java.util.PriorityQueue.add(PriorityQueue.java:321) 
    at attempt1.PQTest.main(PQTest.java:11) 
+0

«Элементы очереди приоритетов упорядочены в соответствии с их естественным порядком или Компаратором, предусмотренным во время построения очереди, в зависимости от того, какой конструктор используется. \ [... \] Очередь приоритетов, основанная на естественном упорядочении также ** не допускает вставки несопоставимых объектов (это может привести к ClassCastException) **] (https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html) «. – Turing85

+0

Чтобы иметь приоритет, вы должны быть в состоянии сказать, что должно быть первым. –

ответ

0

С Java documentation page for PriorityQueue

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

HashSet не реализует Comparable потому что он не может знать, как на самом деле следует сравнить ваши HashSets, следовательно, вы получите ClassCastException. Поэтому вам нужно создать класс, реализующий Comparator, в котором вы будете заказывать эти HashSets по некоторым критериям и поставлять свой экземпляр в конструктор PriorityQueue.