2012-08-01 8 views
37

Digamos que tenemos una colección de artículos:Como llegar elemento max() de la Lista de guayaba

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

List<Item> list = getListOfItems(); 

me gustaría obtener un elemento con un precio máximo de esa lista con la biblioteca de guayaba (con 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?

Respuesta

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

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 tienen el precio máximo: O (n).

+0

si el precio no es int. ¿Están en guayaba la manera de usar este enfoque? – gstackoverflow

+0

El tipo de precio es irrelevante. Solo necesita proporcionar un pedido que compare los artículos por precio. Digamos que es BigDecimal, debería usar 'return left.price.compareTo (right.price)'. –

34

Según la respuesta de JB, también se puede utilizar un poco de forma abreviada cuando se trabaja con valores que tienen orden natural, por ejemplo:

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

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

11

Puede hacerlo sin guayaba.

Collections proporciona min y max métodos que operan en cualquier colección, incluidas las sobrecargas que toman comparadores. Aquí utilizamos los métodos estáticos de Java 8 comparador con una lambda para especificar de forma concisa un comparador, pero antes de Java 8 Puede utilizar una clase anónima:

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

Estos métodos se lanzan NoSuchElementException si la colección está vacía.


Java 8 arroyos proporcionan min y max funciones que toman un comparador. Estas funciones devuelven Optional<T> para manejar correctamente 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, que tendría que utilizar

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

Esto funcionará para cualquier fuente de corriente, que incluye todas las implementaciones Collection, así como otras cosas como archivos, y hace que sea fácil de calcular el máximo de un subconjunto de una colección al filtrar la secuencia. Si tiene una gran colección y un comparador costoso (por ejemplo, el ordenamiento natural de String), puede usar una transmisión paralela.

(Aparte:. Idealmente corriente proporcionaría min y max sobrecargas que toman ningún argumento cuando el tipo de corriente implementa Comparable Desafortunadamente Java no soporta condicionalmente la exposición de los métodos basados ​​en un parámetro de tipo, y no vale la pena introducir un nuevo StreamOfComparable interfaz que extiende Stream solo para este caso.)

Cuestiones relacionadas