2012-08-01 10 views
37

Powiedzmy mamy kolekcję przedmiotów:Jak zdobyć max() elementu z listy w Guava

class Item { 
    public String title; 
    public int price; 
} 

List<Item> list = getListOfItems(); 

chciałbym uzyskać produkt o maksymalnej cenie poza tym wykazie z biblioteki Guava (z Ordering, przypuszczam). Mam na myśli coś podobnego do tego kodu Groovy:

list.max{it.price} 

Jak to zrobić? Jak skuteczne jest to?

Odpowiedz

55
Ordering<Item> o = new Ordering<Item>() { 
    @Override 
    public int compare(Item left, Item right) { 
     return Ints.compare(left.price, right.price); 
    } 
}; 
return o.max(list); 

To tak skuteczne, jak to może być: to iteracje przez pozycje na liście, a następnie zwraca pierwszy z elementów mających maksymalną cenę: O (n).

+0

jeśli cena nie jest równa int. Czy guava jest sposobem na zastosowanie tego podejścia? – gstackoverflow

+0

Rodzaj ceny jest nieistotny. Wystarczy podać zamówienie, które porównuje produkty według ceny. Powiedzmy, że to BigDecimal, użyjesz 'return left.price.compareTo (right.price)'. –

34

Według odpowiedź JB, można również korzystać z niektórych skrótów podczas pracy z wartościami, które mają naturalny porządek, na przykład:

Ordering.<Integer> natural().max(listOfIntegers); 

Zobacz Ordering.natural() szczegóły.

11

Możesz to zrobić bez Guawy.

Kolekcje udostępniają metody, które działają na dowolnej kolekcji, w tym przeciążenia pobierające komparatory. Tutaj używamy Java 8 Komparator metody statyczne z lambda do zwięźle określić komparator, ale przed 8 Java można użyć anonimowego Klasa:

Item max = Collections.max(list, Comparator.comparingInt(i -> i.price)); 

Te metody będą rzucać NoSuchElementException jeśli kolekcja jest pusta.


Java 8 strumienie zapewnić min i max zadań bierze komparator. Te funkcje zwracają Optional<T>, aby zręcznie obsługiwać pusty strumień. Metody statyczne w Komparatorze są przydatne do zwięzłego określania komparatorów, w tym wspólnego przypadku uporządkowania naturalnego. Na to pytanie, można użyć

Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price)); 

To będzie pracować dla dowolnego źródła strumienia, który obejmuje wszystkie implementacje Collection, jak również inne rzeczy, takie jak pliki, i sprawia, że ​​łatwo obliczyć max podzbiorem kolekcja przez filtrowanie strumienia. Jeśli masz dużą kolekcję i kosztowny komparator (np. Naturalne zamówienie String), możesz użyć strumienia równoległego.

(bok. Idealnie Stream zapewni min i max przeciążeń sobą nie argument, gdy typ strumienia realizuje Porównywalne Niestety Java nie obsługuje warunkowo odsłaniając metody oparte na parametrze typ, a to nie jest warte wprowadzenia nowego StreamOfComparable interfejs rozszerzający Strumień tylko dla tego przypadku.)

Powiązane problemy