2012-04-09 90 views
4

我有一個類,它使用優先級隊列以升序顯示5個字符串。我明白,要降序,我可以使用「collections.reverseOrder()」方法。如何在下面的代碼中使用這個方法?反向自然順序使用collections.reverseOrder()

import java.util.*; 
public class queue { 

    public static void main (String[] args) { 

     PriorityQueue<String> sQ = new PriorityQueue<String>(); 

     sQ.add("theodore"); 
     sQ.add("theo"); 
     sQ.add("Shailee"); 
     sQ.add("Deborah"); 
     sQ.add("Fernando"); 
     sQ.add("th"); 

     while (sQ.size() > 0) 
      System.out.println(sQ.remove()); 

     Collections.reverseOrder(); //I am stuck here... 
    } 
} 

回答

11

嘗試這樣的事情,之前sQ刪除的元素:

PriorityQueue<String> reversed = 
    new PriorityQueue<String>(sQ.size(), new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     return -o1.compareTo(o2); 
    } 
}); 
reversed.addAll(sQ); // now `reversed` contains the reversed priority queue 

因爲你使用的String自然排序,這是有道理的,只是建一個PriorityQueue作爲參數傳遞新比較器,用於比較字符串但反轉訂單(請注意比較前面的-標誌)。

編輯:

正如已經指出的意見,這是一個更簡單的解決方案:

PriorityQueue<String> reversed = 
    new PriorityQueue<String>(sQ.size(), Collections.reverseOrder()); 
reversed.addAll(sQ); 
+0

你能告訴我「o1和o2」是什麼嗎? – choloboy 2012-04-09 19:39:49

+0

@Oscar你甚至可以做得更簡單。這也應該工作:'PriorityQueue reversed = new PriorityQueue (sQ.size(),Collections.reverseOrder());' – 2012-04-09 19:48:55

+0

集合中的每一對元素。當隊列對元素進行排序時,比較器會爲每對元素調用以確定哪個元素應該首先進入 – 2012-04-09 19:50:04

1

你也可以試試這個:

String[] strArray = new String[0]; 

    /*Creating array from Queue*/ 
    strArray = sQ.toArray(strArray); 

    Arrays.sort(strArray,Collections.reverseOrder()); 

    System.out.println("\n Elements of Queue in REVERSE:\n"); 

    for(String s:strArray) 
    System.out.print(s+" ,"); 

但問題是,它也將排序您的名單相反順序