2017-06-04 3 views
0

Bien que cette question a déjà été posée, mais j'ai un doute spécifique à l'implémentation.ne peut pas convertir en java.lang.Comparable

Je suis en train d'imprimer la vue de dessus de l'arbre binaire et qui suit est le code complet pour elle:

import java.util.*; 

class Node{ 
    int data; 
    Node right; 
    Node left; 
    Node(int data){ 
     this.data = data; 
    } 
} 

class Pair<F,S>{ 
    private F first; 
    private S second; 
    public Pair(F first, S second){ 
     this.first = first; 
     this.second = second; 
    } 

    public F getFirst(){return first;} 
    public S getSecond(){return second;} 
} 

class BinaryTreeTopView{ 

    public static void printTopView(Node root){ 

     if(root == null) 
      return; 

    Queue <Pair<Node,Integer>> q = new Queue<>(); 
    Map <Integer,Node> map = new HashMap<>(); 
    Pair<Node,Integer> p = new Pair<>(root, 0); 
    q.add(p); 

    /* 
    I am storing nodes and the corresponding horizontal distances 
    in the form of a pair which then are being stored in the queue 
    to ensure level order traversal 
    */ 

    while(!q.isEmpty()){ 
     Pair<Node,Integer> temp = q.peek(); 
     q.remove(); 

     if(map.containsKey(temp.getSecond())==true){ 
      map.put(temp.getSecond(),temp.getFirst()); 
     } else { 
      System.out.println(temp.getFirst().data); 
      map.put(temp.getSecond(),temp.getFirst());     
     } 

     if(temp.getFirst().left!=null){ 
      Pair<Node,Integer> left = new Pair<>(temp.getFirst().left, temp.getSecond()-1); 
      q.add(left); 
     } 

     if(temp.getFirst().right!=null){ 
      Pair<Node,Integer> right = new Pair<> (temp.getFirst().right, temp.getSecond()+1); 
      q.add(right); 
     } 

    } 
} 
public static void main(String[] args) { 
    Node root = new Node(1); 
    root.left = new Node(2); 
    root.right = new Node(3); 
    root.left.right = new Node(5); 
    root.left.left = new Node(4); 
    root.right.left = new Node(6); 
    root.right.right = new Node(7); 
    root.right.left.right = new Node(8); 
    root.right.right.left = new Node(10); 
    root.right.right.right = new Node(9); 
    root.right.right.left.right = new Node(11); 
    root.right.right.left.right.right = new Node(12); 

    printTopView(root); 
} 
} 

Il compile bien, mais une exception est soulevée à l'exécution. Maintenant, je reçois des l'exception suivante et je suis incapable de comprendre ce que le problème est:

Exception in thread "main" java.lang.ClassCastException: 
    Pair 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) 
+3

Quelle est la trace de la pile ** complète **? c'est-à-dire, quelle ligne dans votre code correspond-elle? –

+1

Aussi, je ne crois pas que ce soit votre vrai code, car 'new file <>()' ne compile pas. –

+0

@ OliverCharlesworth..Oh je suis désolé ... Mais c'est mon code .... J'ai effectivement posté le code non édité ... Bien sûr, il ne sera pas compiler ... bt celui que j'ai effectivement comblé avait PriorityQueue. .. Alors ... Quoi qu'il en soit merci de le signaler! – pkenil96

Répondre

1

C'est parce que paire n'applique pas Comparable. Soit mettre en œuvre:

public class Pair implements Comparable<Pair> { 
    public int compareTo(Pair o) { 
     // ... 
    } 
} 

Ou utilisez dans votre file d'attente Comparator prioritaire

+0

Ok ça a marché! Merci beaucoup pour la réponse! Mais je ne sais toujours pas pourquoi j'ai besoin d'implémenter une interface comparable et remplacer la méthode compareTo! – pkenil96

+0

De l'erreur, il semble que vous utilisez la file d'attente prioritaire, Si vous voyez cette classe utiliser comparable ou si le comparateur pour comparer entre deux éléments –

+0

Ouais mais quel est le besoin d'utiliser un comparateur quand je ne l'utilise pas .... Je tous Je fais est de stocker mes objets dans une file d'attente ... ?? – pkenil96

1

Vous essayez d'ajouter Pair cas à un PriorityQueue, de sorte que votre classe Pair doit être Comparable. Une mise en œuvre raisonnable pourrait être de forcer F et S être Comparable sur leur droite, puis comparer le premier élément, puis le second:

class Pair<F extends Comparable<F>, S extends Comparable<S>> 
    implements Comparable<Pair<F, S>> { 

    // All the code you already have is fine 

    @Override 
    public int compareTo(Pair<F, S> o) { 
     int retVal = getFirst().compareTo(o.getFirst()); 
     if (retVal != 0) { 
      return retVal; 
     } 
     return getSecond().compareTo(o.getSecond()); 
    } 
} 
+0

Ok..mais j'ai encore un dout..mon méthode ne fait aucune comparaison nulle part alors pourquoi ai-je besoin de comparer o.first et o.second – pkenil96

+0

Le 'PriorityQueue' trie ses éléments par leur ordre naturel (ie, ça les trie). Pour ce faire, les éléments doivent être comparables. – Mureinik