2016-11-23 9 views
0

Что не так с этим кодом. Я получаю ниже сообщение об ошибке.Исключение из потока «main» java.lang.ClassCastException: с приоритетной очередью и компаратором

Exception in thread "main" java.lang.ClassCastException: Nodes cannot be cast to java.lang.Comparable 
    at java.util.PriorityQueue.siftUpComparable(Unknown Source) 
    at java.util.PriorityQueue.siftUp(Unknown Source) 
    at java.util.PriorityQueue.offer(Unknown Source) 
    at java.util.PriorityQueue.add(Unknown Source) 

пожалуйста, помогите

import java.util.Comparator; 
import java.util.InputMismatchException; 
import java.util.List; 
import java.util.PriorityQueue; 
import java.util.Queue; 

class Nodes implements Comparator<Nodes> { 
     public int n; 
     public int c; 

     public Nodes() { 
     } 

     public Nodes(int n, int c) { 
      this.n = n; 
      this.c = c; 
     } 

     @Override 
     public int compare(Nodes Nodes1, Nodes Nodes2) { 
      if (Nodes1.c < Nodes2.c) { 
       return -1; 
      } 
      if (Nodes1.c > Nodes2.c) { 
       return 1; 
      } 
      return 0; 
     } 
    } 
class dj 
{ 
    public static void main(String[] args) { 
Queue<Nodes> pq = new PriorityQueue<Nodes>(); 
    pq.add(new Nodes(5,4)); 
    pq.add(new Nodes(6,7)); 
    pq.add(new Nodes(7,6)); 
    pq.add(new Nodes(8,9)); 
    pq.add(new Nodes(9,8)); 
    pq.add(new Nodes(8,8)); 

    } 
} 
+3

Вы, вероятно, Мента реализовать Сопоставимые, не Компаратор –

+2

И подсказка: * реальные * вещь здесь, чтобы узнать: научиться читать сообщения исключений - они говорят вам ** ** именно то, что происходит! Это одна из больших вещей при изучении программирования: вы должны обратить внимание на такие тонкие детали, как «Компаратор», не являющийся тем же, что и «Сопоставимый». – GhostCat

ответ

2

Вы получаете эту ошибку, потому что вы реализовали неправильный интерфейс.

Что вам нужно

class Nodes implements Comparable<Nodes> 

Это указывает на то, что класс Вершины можно сравнить с другими узлами. Это то, что требуется для использования в PriorityQueue.

Компаратор - это класс, который сравнивает объекты, даже если они не реализуют Сопоставимые сами. Это часто может быть передан на конкретные функции сортировки и, как правило, зависит от самого класса (Вы можете иметь несколько Компаратор с различной логикой)

Смотрите JavaDoc из 2-х классов для получения дополнительной информации:

https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

+0

Чтобы сделать ваш ответ безупречным, вы можете вставить ссылки Javadoc самостоятельно ;-) – GhostCat

+0

TQ теперь работает. – pkumar