Existe-t-il un moyen plus simple de trouver tous les éléments dune liste qui sont égaux à lélément max .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Merci!
Commentaires
Réponse
Comment vous « avez fait pour lexemple simple est exactement comment je le ferais. Je peux utiliser groupBy
si javais affaire à un objet plus complexe.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Réponse
Dans votre code, vous parcourez votre liste deux fois (une fois pour la méthode List.max
et une fois pour la méthode List.findAll
). Bien sûr, cela est acceptable, si vous avez juste une petite liste. Si votre liste est très grande , vous ne devriez le parcourir quune seule fois.
Lorsque votre liste ne contient que des primitives, il suffit de stocker le maximum et le nombre de ce maximum dans une variable, de parcourir la liste et de mettre à jour les deux variables :
def list = [1,2,3,4,5,5] def max = null def count = 0 for (int i: list) { if (max == null || i > max) { max = i count = 1 } else if (i == max) { count++ } } println max // 5 println count // 2
Bien sûr, le code ci-dessus a plus de lignes que le vôtre, mais devrait être plus rapide pour les très grandes listes.
Ans wer
Je pense que cette méthode est la plus pratique:
def v = [ 1,2,3,4,5,5 ] v = v.groupBy { it }.sort { 0 - it.key }.values() assert [[5,5], [4], [3], [2], [1]] == v
Réponse
Cest dommage que Groovy me rende difficile de trouver ou de vérifier un élément dans une liste dentiers au lieu dutiliser
sess.find(valuetobefound)
que
sess.find{it==valuetobefound}
v.findAll { it == v.max() }