2016-11-23 2 views
0

Quel est le problème avec ce code. Je reçois le message d'erreur ci-dessous.Exception dans le fil "principal" java.lang.ClassCastException: avec la file d'attente prioritaire et le comparateur

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) 

s'il vous plaît aider

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

vous ment probablement à mettre en œuvre comparable, non cOMPARATEUR –

+2

Et astuce: ici la * vraie chose * à apprendre: apprendre à lire les messages d'exception - ils vous disent exactement ** ** ce qui se passe! C'est l'une des grandes choses en apprenant la programmation: vous devez faire attention à des détails aussi subtils que "Comparateur" n'étant pas le même que "Comparable". – GhostCat

Répondre

2

Vous obtenez cette erreur, car vous avez implémenté la mauvaise interface.

Qu'est-ce que vous avez besoin est

class Nodes implements Comparable<Nodes> 

Cela indique que la classe de nœuds peut être comparé à d'autres nœuds. Ce qui est requis pour l'utiliser dans une PriorityQueue. Un Comparateur est une Classe qui compare les Objets même s'ils n'implémentent pas le Comparable lui-même.

Il peut souvent être passé à des fonctions de tri spécifiques et est généralement indépendant de la classe elle-même (vous pouvez avoir plusieurs Comparator avec une logique différente)

Voir la JavaDoc des 2 classes pour plus d'informations:

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

Pour rendre votre réponse parfaite, vous pouvez mettre les liens Javadoc vous-même ;-) – GhostCat

+0

TQ ça marche maintenant. – pkumar