una - sacar numero maximo en java
Cómo obtener el elemento max() de List en guayaba (3)
Digamos que tenemos una colección de artículos:
class Item {
public String title;
public int price;
}
List<Item> list = getListOfItems();
Me gustaría obtener un artículo con un precio máximo de esa lista con la biblioteca de Guava (con el Ordering , supongo). Me refiero a algo similar a este código Groovy:
list.max{it.price}
¿Cómo puedo hacer eso? ¿Qué tan eficiente es?
De acuerdo con la respuesta de JB, también puede usar una taquigrafía cuando trabaje con valores que tienen un orden natural, por ejemplo:
Ordering.<Integer> natural().max(listOfIntegers);
Ver Ordering.natural() para más detalles.
Puedes hacer esto sin Guava.
Collections proporciona métodos max
y max
que operan en cualquier colección, incluidas las sobrecargas que toman comparadores. Aquí usamos los métodos estáticos de Java 8 Comparator con una lambda para especificar de forma concisa un comparador, pero antes de Java 8 puede usar una clase anónima:
Item max = Collections.max(list, Comparator.comparingInt(i -> i.price));
Estos métodos arrojarán NoSuchElementException si la colección está vacía.
Las secuencias de Java 8 proporcionan funciones min
y max
tomando un comparador. Estas funciones devuelven Optional<T>
para manejar con gracia la secuencia que está vacía. Los métodos estáticos en el Comparador son útiles para especificar comparadores de forma concisa, incluido el caso común del ordenamiento natural. Para esta pregunta, usarías
Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price));
Esto funcionará para cualquier fuente de transmisión, que incluya todas las implementaciones de Colección, así como otras cosas como archivos, y facilita el cálculo del máximo de un subconjunto de una colección al filtrar la transmisión. Si tiene una gran colección y un costoso comparador (por ejemplo, el ordenamiento natural de String), puede usar una transmisión paralela.
(Aparte: idealmente, Stream proporcionaría sobrecargas max
y max
sin argumentos cuando el tipo de flujo implementa Comparable. Desafortunadamente, Java no admite la exposición condicional de métodos basados en un parámetro de tipo, y no vale la pena introducir una nueva interfaz StreamOfComparable que amplíe Stream solo para este caso.)
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);
Es tan eficiente como puede ser: itera a través de los elementos de la lista y devuelve el primero de los artículos que tiene el precio máximo: O (n).