Esiste un modo più semplice per trovare tutti gli elementi in un elenco uguali allelemento max .

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

Grazie!

Commenti

  • Utilizza un metodo inline: v.findAll { it == v.max() }
  • @ArturoHerrero eseguirà il metodo max () per ogni elemento nellelenco? o il compilatore lo ottimizzerebbe per trovare il massimo solo una volta e poi confrontarlo con ogni elemento?

Risposta

Come lhai fatto per il semplice esempio è esattamente come lo farei io. Potrei usare groupBy se avessi a che fare con un oggetto più complesso.

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

Risposta

Nel tuo codice vai due volte sulla tua lista (una volta per il metodo List.max e una volta per il metodo List.findAll). Ovviamente questo è accettabile, se hai solo un piccolo elenco. Se il tuo elenco è molto grande , dovresti esaminarlo solo una volta.

Quando la tua lista contiene solo primitive, è sufficiente memorizzare il massimo e il conteggio di questo massimo in una variabile, per scorrere lelenco e aggiornare entrambe le variabili :

 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 

Ovviamente il codice precedente ha più righe del tuo, ma dovrebbe essere più veloce per elenchi molto grandi.

Ans wer

Penso che questo sia il modo più 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 

Risposta

È un peccato che Groovy mi renda difficile trovare o controllare elementi da un elenco di numeri interi invece di utilizzare

 sess.find(valuetobefound) 

di

 sess.find{it==valuetobefound} 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *