2010-09-14 7 views
14

La implementación de la cola de prioridad en la biblioteca estándar de Java parece ser una cola de prioridad mínima que encuentro algo confusa. Para convertirlo en uno máximo, creé un objeto comparador personalizado.Cambio de la prioridad de JavaDebido a un PQ máximo

Comparator<Integer> cmp = new Comparator<Integer>() 
{ 
    public int compare(Integer x, Integer y) 
    { 
     return y - x; 
    } 
}; 

Me preguntaba si había una solución más elegante. Básicamente, no quería una cola de prioridad genérica que pudiera usarse para implementar Dijkstras, etc. Ni siquiera me di cuenta de que habría una que operara en reversa:/

Respuesta

13

Utilice el comparador de Java Collections.reverseOrder().

Java Reference

0

Si tiene un comparador existente, podría crear una inversión genérica comparador.

public class InverseComparator<T> implements Comparator<T> { 
    private final Comparator<T> delegate; 

    public InverseComparator(Comparator<T> delegate) { 
     this.delegate = delegate; 
    } 

    public int compare(T x, T y) { 
     return delegate(y, x); 
    } 
} 
3

No está seguro de lo que entendemos por elegante, pero cuando quiero una PQ implementado como un MaxHeap (utilizado en Dijkstra) que sólo tiene que utilizar un constructor en línea de comparación.

PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(20, new Comparator<Integer>(){ 
      public int compare(Integer o1, Integer o2){ 
       return o2 - o1; 
      } 
     }); 

Es lo suficientemente simple para cualquier momento que estoy buscando algo simple y solo quiero usar el Comparador una vez.

18

Aquí es un fragmento de código usando Collections.reverseOrder() -

PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(20,Collections.reverseOrder()); 

También es necesario para proporcionar la capacidad inicial de la cola de prioridad (20 aquí) junto con el comparador.

+3

Java 8 agrega un constructor que solo tiene un Comparador (https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html), por lo tanto, si está utilizando Java 8, no tiene que proporcionar la capacidad inicial. – tsleyson

Cuestiones relacionadas