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