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

  • Utilisez une méthode en ligne: v.findAll { it == v.max() }
  • @ArturoHerrero cela exécuterait-il la méthode max () pour chaque élément de la liste? ou le compilateur optimiserait-il cela pour ne trouver le maximum quune seule fois, puis le comparer à chaque élément?

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} 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *