Jak uzyskać element max() z listy w Guava

Powiedzmy, że mamy zbiór przedmiotów:

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

List<Item> list = getListOfItems();

Chciałbym dostać przedmiot o maksymalnej cenie z tej listy z biblioteki Guava (z zamawiania , jak przypuszczam). Chodzi mi o coś podobnego do tego Groovy code:

list.max{it.price}
Jak to zrobić? Jak wydajny jest?
 37
Author: sebkur, 2012-08-01

3 answers

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);

Jest tak wydajny, jak tylko może być: iteracja przez elementy listy i zwraca pierwszy z elementów o maksymalnej cenie: O (n).

 57
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 12:18:51

Zgodnie z odpowiedzią JB, możesz również użyć jakiegoś skrótu podczas pracy z wartościami, które mają naturalny porządek, na przykład:

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

Zobacz Zamawianie.natural () dla szczegółów.

 36
Author: Marcin Kubala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 21:28:04

Możesz to zrobić bez guawy.

Zbiory zapewniają min oraz max metody, które działają na każdym zbiorze, w tym przeciążenia biorące komparatory. Tutaj używamy statycznych metod Java 8 Comparator z lambda, aby zwięźle określić komparator, ale przed Java 8 można użyć anonimowej klasy:

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

Te metody rzucają NoSuchElementException, jeśli kolekcja jest pusta.


Java 8 streams provide min oraz max funkcje biorące komparator. Funkcje te zwracają Optional<T>, aby z wdzięcznością obsłużyć pusty strumień. Metody statyczne w Komparatorze są przydatne do zwięzłego określania komparatorów, w tym wspólnego przypadku naturalnego porządku. Do tego pytania użyłbyś

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

Będzie to działać dla dowolnego źródła strumienia, które zawiera wszystkie implementacje kolekcji, a także inne rzeczy, takie jak pliki, i ułatwia obliczenie maksimum podzbioru kolekcji przez filtrowanie strumienia. Jeśli masz dużą kolekcję i drogi komparator (np. naturalną kolejność strun), możesz użyć strumienia równoległego.

(pomijając: najlepiej Stream dostarczy min i max przeciążenia nie biorąc żadnego argumentu, gdy typ stream implementuje porównywalne. Niestety Java nie obsługuje warunkowo wystawiania metod opartych na parametrze type i nie warto wprowadzać nowego interfejsu StreamOfComparable rozszerzającego Stream tylko w tym przypadku.)

 13
Author: Jeffrey Bosboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-23 15:59:33