2012-09-06 128 views
1

我想創建節點的優先級隊列,其中節點的優先級是它們的頻率。但是輸出不包含正確位置的第一個元素,所有其他元素都位於正確的位置。Java問題中的優先級隊列排序

import java.util.*; 
class node implements Comparable<node>{ 
     char key; 
     int freq; 
     node(){} 
     node(char k,int f){ 
       key=k; 
       freq=f; 
     } 
    public int compareTo(node n){ 
      if(freq>n.freq)return 1; 
      return 0; 
     } 
} 

public class test{ 
    public static void main(String[] args){ 
     node x=new node('x',4); 
     node a=new node('a',2); 
     node b=new node('b',1); 
     node c=new node('c',7); 
     PriorityQueue<node> q = new PriorityQueue<node>(); 

     q.offer(a); 
     q.offer(b); 
     q.offer(c); 
     q.offer(x); 

     while(!q.isEmpty()){ 
      node d=q.poll(); 
      System.out.println(d.key+" "+d.freq); 
     } 
    } 
} 

輸出:

a 2 
    b 1 
    x 4 
    c 7 

不應該的順序進行B,A,X,C 感謝。

回答

5

你的比較是錯誤的:如果freq < n.freq,則返回0,而不是返回一個負數。

的代碼應該是

return Ints.compare(freq, n.freq); // with Guava 

return Integer.valueOf(freq).compareTo(Integer.valueOf(n.freq)) // with plain Java 

if (freq > n.freq) return 1; 
if (freq < n.freq) return -1; 
return 0; 
+0

那麼什麼是返回0的需要? – Jignesh

+1

當對象被認爲相等時,即當頻率相同時,返回0。 –

2

添加
else if (freq<n.freq) return -1;
爲公衆詮釋的compareTo(節點n)