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

  • Use um método embutido: v.findAll { it == v.max() }
  • @ArturoHerrero isso executaria o método max () para cada elemento da lista? ou o compilador otimizaria isso para encontrar o máximo apenas uma vez e depois comparar com cada elemento?

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} 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *