37 votes

Comment obtenir l'élément max () à partir d'une liste en goyave

Disons que nous avons une collection d'objets:

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

List<Item> list = getListOfItems();
 

Je voudrais obtenir un article avec un prix maximum de cette liste avec la bibliothèque Guava (avec Ordering , je présume). Je veux dire quelque chose de similaire à ce code Groovy:

 list.max{it.price}
 

Comment je fais ça? Quelle est son efficacité?

58voto

JB Nizet Points 250258
 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);
 

Il est aussi efficace que possible: il parcourt les éléments de la liste et renvoie le premier des articles ayant le prix maximal: O (n).

37voto

Marcin Kubala Points 291

Selon la réponse de JB, vous pouvez également utiliser un raccourci lorsque vous travaillez avec des valeurs qui ont un ordre naturel, par exemple:

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

Voir http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Ordering.html#natural () pour plus de détails.

14voto

Jeffrey Bosboom Points 1255

Vous pouvez le faire sans la Goyave.

Collections fournit min et max méthodes qui fonctionnent sur n'importe quelle Collection, y compris surcharges de prendre des comparateurs. Ici, nous utilisons la Java 8 Comparaison des méthodes statiques avec un lambda de manière concise spécifier un comparateur, mais avant Java 8, vous pouvez utiliser une classe anonyme:

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

Ces méthodes vont se jeter NoSuchElementException si la collection est vide.


Java 8 les cours d'eau fournissent min et max fonctions prenant un comparateur. Ces fonctions renvoient Optional<T> pour gérer harmonieusement les flux de vide. Les méthodes statiques dans la Comparaison sont utiles pour, de façon concise, en précisant des éléments de comparaison, y compris celui de l'ordre naturel. Pour cette question, vous pourriez utiliser

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

Cela fonctionne pour n'importe quel flux de la source, qui comprend la Collection de toutes les implémentations, ainsi que d'autres choses comme pour les fichiers, et il est facile de calculer le max d'un sous-ensemble d'une collection en filtrant les flux. Si vous avez une grande collection et un cher de comparaison (p. ex., Chaîne naturelle de la commande), vous pouvez utiliser un courant parallèle.

(Aparté: idéalement Flux de fournir de l' min et max des surcharges en ne prenant aucun argument lorsque les flux de type implémente Comparable. Malheureusement Java ne supporte pas conditionnellement de l'exposer à des méthodes basées sur un paramètre de type, et ce n'est pas la peine de l'introduction d'un nouveau StreamOfComparable de l'interface de l'extension de Flux de juste pour ce cas.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X