Tenho fila de prioridade em Java de inteiros:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
Quando ligo pq.poll()
, obtenho o elemento mínimo.
Pergunta: como alterar o código para obter o elemento máximo?
java
collections
priority-queue
Borut Flis
fonte
fonte
Respostas:
Que tal assim:
O
Collections.reverseOrder()
fornece umaComparator
que classificaria os elementos emPriorityQueue
uma ordem oposta à sua ordem natural neste caso.fonte
Collections.reverseOrder()
também está sobrecarregado para obter um comparador, portanto, também funciona se você comparar objetos personalizados.PriorityQueue(Comparator<? super E> comparator)
.Você pode usar a expressão lambda desde Java 8.
O código a seguir imprimirá 10, o maior.
A função lambda pegará dois inteiros como parâmetros de entrada, os subtrairá um do outro e retornará o resultado aritmético. A função lambda implementa a Interface Funcional
Comparator<T>
,. (Isso é usado no local, ao contrário de uma classe anônima ou uma implementação discreta.)fonte
(x, y) -> y - x
pode não ser apropriado para inteiros longos devido ao estouro. Por exemplo, os números y = Integer.MIN_VALUE ex = 5 resultam em um número positivo. É melhor usarnew PriorityQueue<>((x, y) -> Integer.compare(y, x))
. Porém, a melhor solução é dada por @Edwin Dalorzo para usoCollections.reverseOrder()
.Você pode fornecer um
Comparator
objeto personalizado que classifica os elementos na ordem inversa:Agora, a fila de prioridade inverterá todas as suas comparações, de modo que você obterá o elemento máximo em vez do elemento mínimo.
Espero que isto ajude!
fonte
if (rhs < lhs) return +1;
if (rhs > lhs) return -1;
if (lhs < rhs) return +1; if (lhs > rhs) return -1;
fonte
b-a
pode causar,overflow
então deve evitar usá-lo e deve usarCollections.reverseOrder();
como um comparador ou substituir ba com oInteger.compare(a,b);
qual foi adicionado emJava 8
No Java 8+, você pode criar uma fila de prioridade máxima por meio de um destes métodos:
Método 1:
Método 2:
Método 3:
fonte
Os elementos da fila de prioridade são ordenados de acordo com sua ordem natural ou por um Comparador fornecido no momento da construção da fila.
O Comparador deve substituir o método de comparação.
O método de comparação padrão retorna um número inteiro negativo, zero ou um número inteiro positivo, pois o primeiro argumento é menor, igual ou maior que o segundo.
O PriorityQueue padrão fornecido por Java é Min-Heap, se você quiser um heap máximo a seguir está o código
Referência: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#comparator ()
fonte
Aqui está um exemplo de Max-Heap em Java:
A saída será 10
fonte
Isso pode ser alcançado pelo código abaixo em Java 8, que introduziu um construtor que usa apenas um comparador.
fonte
Você pode usar
MinMaxPriorityQueue
(faz parte da biblioteca Guava): aqui está a documentação . Em vez depoll()
, você precisa chamar opollLast()
método.fonte
Altere PriorityQueue para MAX PriorityQueue Método 1: Queue pq = new PriorityQueue <> (Collections.reverseOrder ()); Método 2: Fila pq1 = new PriorityQueue <> ((a, b) -> b - a); Vejamos alguns exemplos:
Vamos dar um famoso problema de entrevista: Kth maior elemento em uma matriz usando PriorityQueue
Outra maneira:
Como podemos ver, ambos estão dando o mesmo resultado.
fonte
Isso pode ser alcançado usando
fonte
Acabei de executar uma simulação de Monte-Carlo em ambos os comparadores em classificação de pilha dupla mín. Máx. E ambos chegaram ao mesmo resultado:
Estes são os comparadores máximos que usei:
(A) Comparador integrado de coleções
(B) Comparador personalizado
fonte
if (rhs < lhs) return +1;
if (rhs> lhs) return -1;Você pode tentar algo como:
Que funciona para qualquer outra função de comparação de base que você possa ter.
fonte
fonte
Você pode tentar empurrar elementos com sinal reverso. Por exemplo: para adicionar a = 2 & b = 5 e, em seguida, pesquisar b = 5.
Depois de consultar o chefe da fila, inverta o sinal para o seu uso. Isso imprimirá 5 (elemento maior). Pode ser usado em implementações ingênuas. Definitivamente, não é uma solução confiável. Eu não recomendo.
fonte
Podemos fazer isso criando nossa classe CustomComparator que implementa a interface Comparator e substituindo seu método de comparação. Abaixo está o código para o mesmo:
fonte