2012-09-10 47 views
8

在方法中,我收到一個通用的object E extends Comparable<E>作爲參數。現在我想創建兩個優先級隊列。其中一個使用E使用的comparator和其他隊列使用與E使用的comparator相反的隊列(即如果E使用'<',則第二個隊列必須使用'> =')。 請教我如何創建兩個這樣的隊列。如何在java中獲取比較器的反轉

queue2=new PriorityQueue<E>(0,Collections.reverseOrder(e)); 

我收到reverseOrder不適用的錯誤。

請幫忙

回答

11
+0

queue2 = new PriorityQueue (0,Collections.reverseOrder(e)); –

+0

我收到反向序不適用的錯誤。請幫助 –

+0

我*從不知道'Collections.reverseOrder'在那裏。謝謝! –

5

您的對象E延伸java.lang.Comparable,但它不是java.util.Comparator

創建第一個隊列瓦特/ OA比較,你會得到的排序在compareTo功能,然後創建一個java.util.Comparator,做反向的比較(只需調用a.compareTo(B),然後否定的結果)和用該比較器創建第二個隊列。

0

下面的程序描述瞭如何做到這一點。

我有StringLengthComparator,它根據字符串長度進行比較。使用Collections.reverseOrder我創建了反向排序的隊列和正確排序的另一個隊列。

import java.util.Collections; 
import java.util.Comparator; 
import java.util.PriorityQueue; 

public class TestReverseorder { 
public static void main(String[] args) { 
    Comparator<String> comparator = new TestReverseorder().new StringLengthComparator(); 
    PriorityQueue<String> reverse = new PriorityQueue<String>(10, 
      Collections.reverseOrder(comparator)); 
    PriorityQueue<String> queue = new PriorityQueue<String>(10,comparator); 
    queue.add("1"); 
    queue.add("12"); 
    queue.add("123"); 

    reverse.add("1"); 
    reverse.add("12"); 
    reverse.add("123"); 

    while (!queue.isEmpty()) { 
     System.out.println(queue.poll()); 
    } 

    while (!reverse.isEmpty()) { 
     System.out.println(reverse.poll()); 
    } 


} 

public class StringLengthComparator implements Comparator<String> { 
    @Override 
    public int compare(String x, String y) { 
     // Assume neither string is null. Real code should 
     // probably be more robust 
     if (x.length() < y.length()) { 
      return -1; 
     } 
     if (x.length() > y.length()) { 
      return 1; 
     } 
     return 0; 
    } 
} 
} 

它將打印輸出

Normal Order: 
1 
12 
123 
Reverse Order: 
123 
12 
1 
1

Collections.reverseOrder唯一的一個參數是一個比較,而不是一個集合。對於你的代碼,只需使用reverseOrder而不帶參數。您也必須使用非零初始尺寸。以下代碼將起作用。

queue2=new PriorityQueue<E>(1, Collections.reverseOrder());