¿Existe alguna forma más sencilla de encontrar todos los elementos en una lista que son iguales al elemento máximo? .

List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max } 

¡Gracias!

Comentarios

  • Utilice un método en línea: v.findAll { it == v.max() }
  • @ArturoHerrero, ¿ejecutaría eso el método max () para cada elemento de la lista? ¿O el compilador optimizaría eso para encontrar el máximo solo una vez y luego compararlo con cada elemento?

Respuesta

Cómo lo ha hecho para el ejemplo simple es exactamente cómo lo haría yo. Puedo usar groupBy si estuviera tratando con un objeto más complejo.

 List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results 

Responder

En su código, repasa dos veces la lista (una vez para el método List.max y una vez para el método List.findAll). Por supuesto, esto es aceptable, si solo tiene una lista pequeña. Si su lista es muy grande , debe revisarlo solo una vez.

Cuando su lista solo contiene primitivas, es suficiente almacenar el máximo y el conteo de este máximo en una variable, para revisar la lista y actualizar ambas 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 

Por supuesto, el código anterior tiene más líneas que el suyo, pero debería ser más rápido para listas muy grandes.

Ans wer

Creo que esta es la forma más conveniente:

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 

Respuesta

Es una pena que Groovy me haga difícil encontrar o verificar elementos de una lista de números enteros en lugar de usar

 sess.find(valuetobefound) 

que

 sess.find{it==valuetobefound} 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *