Existe alguma maneira mais simples de encontrar todos os elementos em uma lista que são iguais ao elemento max .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Obrigado!
Comentários
Resposta
Como você fez para o exemplo simples, é exatamente como eu faria. Posso usar groupBy
se estiver lidando com um objeto mais complexo.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Resposta
No seu código, você passa duas vezes na lista (uma vez para o método List.max
e uma vez para o método List.findAll
). Claro que isso é aceitável, se você tiver apenas uma lista pequena. Se a sua lista for muito grande , você deve percorrê-la apenas uma vez.
Quando sua lista contém apenas primitivas, é suficiente armazenar o máximo e a contagem desse máximo em uma variável, para percorrer a lista e atualizar as duas variáveis :
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
É claro que o código acima tem mais linhas que o seu, mas deve ser mais rápido para listas muito grandes.
Resp wer
Acho que esta forma é a mais 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
Resposta
É uma pena que Groovy torne difícil para mim encontrar ou verificar um elemento de uma lista de inteiros em vez de usar
sess.find(valuetobefound)
do que
sess.find{it==valuetobefound}
v.findAll { it == v.max() }