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? 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).
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.
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.)
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