Tengo cola de prioridad en Java de Integers:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
Cuando llamo pq.poll()
obtengo el elemento mínimo.
Pregunta: ¿cómo cambiar el código para obtener el elemento máximo?
java
collections
priority-queue
Borut Flis
fuente
fuente
Respuestas:
¿Qué tal esto?
El
Collections.reverseOrder()
proporciona unComparator
que ordenaría los elementos en elPriorityQueue
orden opuesto a su orden natural en este caso.fuente
Collections.reverseOrder()
también está sobrecargado para tomar un comparador, por lo que también funciona si compara objetos personalizados.PriorityQueue(Comparator<? super E> comparator)
.Puede usar la expresión lambda desde Java 8.
El siguiente código imprimirá 10, el más grande.
La función lambda tomará dos enteros como parámetros de entrada, los restará entre sí y devolverá el resultado aritmético. La función lambda implementa la interfaz funcional,
Comparator<T>
. (Esto se usa en el lugar, a diferencia de una clase anónima o una implementación discreta).fuente
(x, y) -> y - x
puede no ser apropiado para enteros largos debido al desbordamiento. Por ejemplo, los números y = Integer.MIN_VALUE y x = 5 dan como resultado un número positivo. Es mejor usarnew PriorityQueue<>((x, y) -> Integer.compare(y, x))
. Sin embargo, la mejor solución la da @Edwin Dalorzo para usarCollections.reverseOrder()
.Puede proporcionar un
Comparator
objeto personalizado que clasifique los elementos en orden inverso:Ahora, la cola de prioridad invertirá todas sus comparaciones, por lo que obtendrá el elemento máximo en lugar del elemento mínimo.
¡Espero que esto ayude!
fuente
if (rhs < lhs) return +1;
if (rhs > lhs) return -1;
if (lhs < rhs) return +1; if (lhs > rhs) return -1;
fuente
b-a
puede causar,overflow
por lo que debe evitar usarlo y debe usarloCollections.reverseOrder();
como comparador o reemplazar ba con elInteger.compare(a,b);
que se ha agregado enJava 8
En Java 8+ puede crear una cola de prioridad máxima a través de uno de estos métodos:
Método 1:
Método 2:
Método 3:
fuente
Los elementos de la cola de prioridad se ordenan de acuerdo con su orden natural, o mediante un Comparador proporcionado en el momento de la construcción de la cola.
El comparador debe anular el método de comparación.
El método de comparación predeterminado devuelve un entero negativo, cero o un entero positivo ya que el primer argumento es menor, igual o mayor que el segundo.
La PriorityQueue predeterminada proporcionada por Java es Min-Heap, si desea un montón máximo, el siguiente es el código
Referencia: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#comparator ()
fuente
Aquí hay una muestra de Max-Heap en Java:
La salida será 10
fuente
Esto se puede lograr mediante el siguiente código en Java 8 que ha introducido un constructor que solo toma un comparador.
fuente
Puede usar
MinMaxPriorityQueue
(es parte de la biblioteca de Guava): aquí está la documentación . En lugar depoll()
, debe llamar alpollLast()
método.fuente
Cambiar PriorityQueue a MAX PriorityQueue Método 1: Cola pq = new PriorityQueue <> (Collections.reverseOrder ()); Método 2: Cola pq1 = new PriorityQueue <> ((a, b) -> b - a); Veamos algunos ejemplos:
Tomemos una entrevista famosa Problema: K-ésimo elemento más grande en una matriz usando PriorityQueue
De otra manera :
Como podemos ver, ambos están dando el mismo resultado.
fuente
Esto se puede lograr usando
fuente
Acabo de ejecutar una simulación de Monte-Carlo en ambos comparadores en el tipo de pila doble min max y ambos obtuvieron el mismo resultado:
Estos son los comparadores máximos que he usado:
(A) Comparador integrado de colecciones
(B) Comparador personalizado
fuente
if (rhs < lhs) return +1;
si (rhs> lhs) return -1;Puedes probar algo como:
Lo que funciona para cualquier otra función de comparación de base que pueda tener.
fuente
fuente
Puede intentar empujar elementos con signo inverso. Por ejemplo: Sumar a = 2 & b = 5 y luego sondear b = 5.
Una vez que haya sondeado al principio de la cola, invierta el signo para su uso. Esto imprimirá 5 (elemento más grande). Se puede utilizar en implementaciones ingenuas. Definitivamente no es una solución confiable. No lo recomiendo
fuente
Podemos hacer esto creando nuestra clase CustomComparator que implementa la interfaz Comparator y anulando su método de comparación. A continuación se muestra el código para el mismo:
fuente