Mam kolejkę priorytetową w Javie Integers:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
Kiedy dzwonię pq.poll()
, otrzymuję element minimum.
Pytanie: jak zmienić kod, aby uzyskać maksymalny element?
java
collections
priority-queue
Borut Flis
źródło
źródło
Odpowiedzi:
Co powiesz na to:
Collections.reverseOrder()
ZapewniaComparator
, że sortowania elementów wPriorityQueue
w w przeciwległy celu ich naturalnego porządku w tej sprawie.źródło
Collections.reverseOrder()
jest również przeciążony, aby wziąć komparator, więc działa również, jeśli porównujesz obiekty niestandardowe.PriorityQueue(Comparator<? super E> comparator)
.Możesz używać wyrażenia lambda od wersji Java 8.
Poniższy kod wypisze 10, większy.
Funkcja lambda weźmie dwie liczby całkowite jako parametry wejściowe, odejmie je od siebie i zwróci wynik arytmetyczny. Funkcja N realizuje interfejsu funkcjonalnego,
Comparator<T>
. (Jest to używane w miejscu, w przeciwieństwie do klasy anonimowej lub dyskretnej implementacji).źródło
(x, y) -> y - x
może nie być odpowiedni dla długich liczb całkowitych z powodu przepełnienia. Na przykład liczby y = Integer.MIN_VALUE i x = 5 dają w wyniku liczbę dodatnią. Lepiej jest użyćnew PriorityQueue<>((x, y) -> Integer.compare(y, x))
. Jednak lepsze rozwiązanie daje @Edwin DalorzoCollections.reverseOrder()
.Możesz podać
Comparator
obiekt niestandardowy, który klasyfikuje elementy w odwrotnej kolejności:Teraz kolejka priorytetowa odwróci wszystkie swoje porównania, więc otrzymasz element maksymalny, a nie element minimalny.
Mam nadzieję że to pomoże!
źródło
if (rhs < lhs) return +1;
if (rhs > lhs) return -1;
if (lhs < rhs) return +1; if (lhs > rhs) return -1;
źródło
b-a
może powodowaćoverflow
tak powinny unikać go i stosowaćCollections.reverseOrder();
jako komparator lub wymienić ba zInteger.compare(a,b);
którego został dodanyJava 8
W Javie 8+ możesz utworzyć kolejkę z maksymalnym priorytetem za pomocą jednej z następujących metod:
Metoda 1:
Metoda 2:
Metoda 3:
źródło
Elementy kolejki priorytetowej są porządkowane zgodnie z ich naturalną kolejnością lub przez Komparator dostarczany w czasie tworzenia kolejki.
Komparator powinien zastąpić metodę porównania.
Domyślna metoda porównania zwraca ujemną liczbę całkowitą, zero lub dodatnią liczbę całkowitą, ponieważ pierwszy argument jest mniejszy, równy lub większy od drugiego.
Domyślna kolejka PriorityQueue dostarczana przez Javę to Min-Heap, jeśli chcesz, aby następowała maksymalna sterta, to kod
Źródła: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#comparator ()
źródło
Oto przykład Max-Heap w Javie:
Wynik wyniesie 10
źródło
Można to osiągnąć za pomocą poniższego kodu w Javie 8, który wprowadził konstruktor, który pobiera tylko komparator.
źródło
Możesz użyć
MinMaxPriorityQueue
(jest to część biblioteki Guava): oto dokumentacja . Zamiast tegopoll()
musisz wywołaćpollLast()
metodę.źródło
Zmień PriorityQueue na MAX PriorityQueue Metoda 1: Kolejka pq = new PriorityQueue <> (Collections.reverseOrder ()); Metoda 2: Queue pq1 = new PriorityQueue <> ((a, b) -> b - a); Spójrzmy na kilka przykładów:
Weźmy słynny wywiad Problem: Kth największy element w tablicy przy użyciu PriorityQueue
Inny sposób :
Jak widać, oba dają ten sam wynik.
źródło
Można to osiągnąć za pomocą
źródło
Właśnie przeprowadziłem symulację Monte-Carlo na obu komparatorach przy sortowaniu podwójnej sterty min max i oba otrzymały ten sam wynik:
Oto maksymalne komparatory, których użyłem:
(A) Wbudowany komparator kolekcji
(B) Niestandardowy komparator
źródło
if (rhs < lhs) return +1;
if (rhs> lhs) return -1;Możesz spróbować czegoś takiego:
Która działa w przypadku każdej innej podstawowej funkcji porównania, którą możesz mieć.
źródło
źródło
Możesz spróbować popychać elementy ze znakiem odwrotnym. Np .: aby dodać a = 2 i b = 5, a następnie odpytać b = 5.
Po odpytaniu szefa kolejki odwróć znak dla swojego użycia. Spowoduje to wydrukowanie 5 (większy element). Może być używany w naiwnych realizacjach. Zdecydowanie nie jest to niezawodna poprawka. Nie polecam tego.
źródło
Możemy to zrobić, tworząc naszą klasę CustomComparator, która implementuje interfejs Comparator i nadpisując jej metodę porównania. Poniżej znajduje się kod tego samego:
źródło