2016-11-23 65 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中使用它所需要的。

Comparator是一個比較對象的類,即使它們沒有實現Comparable自己。它往往被傳遞到特定的排序函數,通常是獨立於類本身的(可以具有不同的邏輯的多個比較器)

參看2類的JavaDoc以獲得更多信息:

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

相關問題