2012-09-10 10 views
8

In un metodo ricevo un argomento generico object E extends Comparable<E>. Ora voglio creare due code prioritarie. Una che usa lo comparator utilizzato da E e altra coda che usa l'opposto di comparator usato da E (cioè se E usa '<' allora la seconda coda deve usare '> ='). Per favore, spiegami come creare due di queste code.Come ottenere inverso di un comparatore in java

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

sto ottenendo l'errore che reverseOrder non è applicabile.

favore aiuto

risposta

11
+0

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

+0

Ho ricevuto l'errore che l'ordine inverso non è applicabile. per favore aiuto –

+0

I * mai * sapeva che 'Collections.reverseOrder' era lì. Grazie! –

5

L'oggetto E si estende java.lang.Comparable, ma non è un java.util.Comparator.

Creare la prima coda w/OA comparatore e si otterrà l'ordine nella funzione compareTo, quindi creare un java.util.Comparator che fa il confronto in senso inverso (basta chiamare a.compareTo (b) e poi negare il risultato) e crea la tua seconda coda con quel comparatore.

0

Sotto il programma viene illustrato come eseguirlo.

Ho StringLengthComparator che si confronta in base alla lunghezza della stringa. Utilizzo di Collections.reverseOrder Ho creato una coda ordinata inversa e un'altra coda ordinata correttamente.

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; 
    } 
} 
} 

Si stamperà uscita

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

L'unico argomento di Collections.reverseOrder è un comparatore e non una collezione. Per il tuo codice usa semplicemente reverseOrder senza argomenti. Devi usare anche una dimensione iniziale non zero. Il seguente codice funzionerà.

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