J'ai une file d'attente prioritaire dans Java of Integers:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
Quand j'appelle, pq.poll()
j'obtiens l'élément minimum.
Question: comment changer le code pour obtenir le maximum d'élément?
java
collections
priority-queue
Borut Flis
la source
la source
Réponses:
Et comme ça:
Le
Collections.reverseOrder()
fournit unComparator
quiPriorityQueue
trierait les éléments dans un ordre opposé à leur ordre naturel dans ce cas.la source
Collections.reverseOrder()
est également surchargé pour prendre un comparateur, donc cela fonctionne également si vous comparez des objets personnalisés.PriorityQueue(Comparator<? super E> comparator)
.Vous pouvez utiliser l'expression lambda depuis Java 8.
Le code suivant imprimera 10, le plus grand.
La fonction lambda prendra deux entiers comme paramètres d'entrée, les soustrayera l'un de l'autre et retournera le résultat arithmétique. La fonction lambda implémente l'interface fonctionnelle,
Comparator<T>
. (Ceci est utilisé sur place, par opposition à une classe anonyme ou à une implémentation discrète.)la source
(x, y) -> y - x
peut ne pas être approprié pour les entiers longs en raison d'un débordement. Par exemple, les nombres y = Integer.MIN_VALUE et x = 5 donnent un nombre positif. Il vaut mieux utilisernew PriorityQueue<>((x, y) -> Integer.compare(y, x))
. Cependant, la meilleure solution est donnée par @Edwin Dalorzo à utiliserCollections.reverseOrder()
.Vous pouvez fournir un
Comparator
objet personnalisé qui classe les éléments dans l'ordre inverse:Maintenant, la file d'attente prioritaire inversera toutes ses comparaisons, vous obtiendrez donc l'élément maximum plutôt que l'élément minimum.
J'espère que cela t'aides!
la source
if (rhs < lhs) return +1;
if (rhs > lhs) return -1;
if (lhs < rhs) return +1; if (lhs > rhs) return -1;
la source
b-a
peut causeroverflow
donc devrait éviter de l'utiliser et devrait utiliserCollections.reverseOrder();
comme comparateur ou remplacer ba avecInteger.compare(a,b);
qui a été ajouté dansJava 8
Dans Java 8+, vous pouvez créer une file d'attente de priorité maximale via l'une de ces méthodes:
Méthode 1:
Méthode 2:
Méthode 3:
la source
Les éléments de la file d'attente prioritaire sont classés selon leur ordre naturel, ou par un comparateur fourni au moment de la construction de la file d'attente.
Le comparateur doit remplacer la méthode de comparaison.
La méthode de comparaison par défaut renvoie un entier négatif, zéro ou un entier positif car le premier argument est inférieur, égal ou supérieur au second.
La PriorityQueue par défaut fournie par Java est Min-Heap, si vous voulez un tas max suivant est le code
Référence: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#comparator ()
la source
Voici un exemple de Max-Heap en Java:
La sortie sera 10
la source
Ceci peut être réalisé par le code ci-dessous dans Java 8 qui a introduit un constructeur qui ne prend qu'un comparateur.
la source
Vous pouvez utiliser
MinMaxPriorityQueue
(cela fait partie de la bibliothèque Guava): voici la documentation . Au lieu depoll()
, vous devez appeler lapollLast()
méthode.la source
Remplacez PriorityQueue par MAX PriorityQueue Méthode 1: Queue pq = new PriorityQueue <> (Collections.reverseOrder ()); Méthode 2: Queue pq1 = new PriorityQueue <> ((a, b) -> b - a); Regardons quelques exemples:
Prenons une interview célèbre Problème: Kth plus grand élément d'un tableau en utilisant PriorityQueue
Autrement :
Comme on peut le voir, les deux donnent le même résultat.
la source
Ceci peut être réalisé en utilisant
la source
Je viens de lancer une simulation Monte-Carlo sur les deux comparateurs sur un tri à double tas min max et ils sont tous les deux arrivés au même résultat:
Voici les comparateurs max que j'ai utilisés:
(A) Comparateur intégré de collections
(B) Comparateur personnalisé
la source
if (rhs < lhs) return +1;
si (rhs> lhs) return -1;Vous pouvez essayer quelque chose comme:
Ce qui fonctionne pour toute autre fonction de comparaison de base que vous pourriez avoir.
la source
la source
Vous pouvez essayer de pousser des éléments avec un signe inverse. Par exemple: pour ajouter a = 2 & b = 5 puis interroger b = 5.
Une fois que vous interrogez la tête de la file d'attente, inversez le signe de votre utilisation. Cela imprimera 5 (élément plus grand). Peut être utilisé dans des implémentations naïves. Ce n'est certainement pas une solution fiable. Je ne le recommande pas.
la source
Nous pouvons le faire en créant notre classe CustomComparator qui implémente l'interface Comparator et en remplaçant sa méthode de comparaison. Voici le code pour le même:
la source