¿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
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}
v.findAll { it == v.max() }