2012-09-10 27 views
8

En un método, recibo un object E extends Comparable<E> genérico como argumento. Ahora quiero crear dos colas de prioridad. Una que usa el comparator usado por E y otra cola que usa el opuesto de comparator usado por E (es decir, si E usa '<', entonces la segunda cola debe usar '> ='). Ayúdame a crear dos de esas colas.Cómo obtener el inverso de un comparador en java

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

estoy consiguiendo el error que reverseOrder no es aplicable.

favor ayuda

Respuesta

11
+0

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

+0

Recibo el error de que reverseorder no es aplicable. por favor ayuda –

+0

Yo * nunca * sabía que 'Collections.reverseOrder' estaba allí. ¡Gracias! –

5

Su objeto E se extiende java.lang.Comparable, pero no es un java.util.Comparator.

Cree su primera cola con un Comparador y obtendrá el pedido en su función compareTo, luego cree un java.util.Comparator que haga la comparación en reversa (simplemente llame a a.compareA (b) y luego niegue el resultado) y crea tu segunda cola con ese comparador.

0

A continuación El programa muestra cómo hacerlo.

Tengo StringLengthComparator que se compara en función de la longitud de la cadena. Utilizando Collections.reverseOrder he creado la cola que está ordenada en reversa y otra cola que está ordenada correctamente.

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

Se imprimirá la salida

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

El único argumento de Collections.reverseOrder es un comparador y no una colección. Para su código simplemente use reverseOrder sin un argumento. También debe usar un tamaño inicial distinto de cero. El siguiente código funcionará.

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