Cómo obtener el elemento max() de la lista en Guayaba


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 Guava library (con Ordenando, supongo). Me refiero a algo similar a este código Groovy:

list.max{it.price}

¿Cómo hago eso? Qué tan eficiente es?

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

Es tan eficiente como puede ser: itera a través de los elementos de la lista, y devuelve el primero de los Elementos que tienen el precio máximo: 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-01 12:18:51

De acuerdo con la respuesta de JB, también puede usar alguna abreviatura cuando se trabaja con valores que tienen orden natural, por ejemplo:

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

Ver Ordenar.natural () para más detalles.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 21:28:04

Puedes hacer esto sin Guayaba.

Colecciones proporciona min y max métodos que operan en cualquier Colección, incluyendo sobrecargas tomando comparadores. Aquí usamos los métodos estáticos del comparador de Java 8 con un lambda para especificar concisamente 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 lanzarán NoSuchElementException si la colección está vacía.


Java 8 flujos proporcionan min y max funciones tomando un comparador. Estas funciones devuelven Optional<T> para manejar con gracia la secuencia que está vacía. Los métodos estáticos en Comparador son útiles para especificar de forma concisa comparadores, incluyendo el caso común del orden natural. Para esta pregunta, usarías

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

Esto funcionará para cualquier fuente de flujo, que incluye todas las implementaciones de colecciones, así como otras cosas como archivos, y hace que sea fácil calcular el máximo de un subconjunto de una colección por filtrando el flujo. Si tiene una colección grande y un comparador costoso (por ejemplo, el orden natural de las cadenas), puede usar una secuencia paralela.

(Aparte: idealmente Stream proporcionaría min y max sobrecargas sin ningún argumento cuando el tipo de flujo implementa Comparable. Desafortunadamente, Java no admite métodos de exposición condicional basados en un parámetro de tipo, y no vale la pena introducir una nueva interfaz StreamOfComparable que extienda Stream solo para este caso.)

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-23 15:59:33