Er der nogen enklere måde at finde alle elementer i en liste, der er lig med det maksimale element .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Tak!
Kommentarer
Svar
Hvordan du har gjort det til det enkle eksempel, er nøjagtigt, hvordan jeg ville gøre det. Jeg kan bruge groupBy
, hvis jeg havde at gøre med et mere komplekst objekt.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Svar
I din kode går du to gange over din liste (en gang for metoden List.max
og en gang til metoden List.findAll
). Det er selvfølgelig acceptabelt, hvis du bare har en lille liste. Hvis din liste er meget stor , skal du gå igennem det kun én gang.
Når din liste bare indeholder primitiver, er det nok at gemme maksimum og optælling af dette maksimum i en variabel for at gå gennem listen og opdatere begge variabler :
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
Selvfølgelig har ovenstående kode flere linjer end din, men skal være hurtigere for meget store lister.
Ans wer
Jeg synes denne måde er den mest bekvemme:
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
Svar
Det er en skam, at Groovy gør det vanskeligt for mig at finde eller kontrollere element fra en liste over heltal i stedet for at bruge
sess.find(valuetobefound)
end
sess.find{it==valuetobefound}
v.findAll { it == v.max() }