Er det en enklere måte å finne alle elementene i en liste som er lik maks-elementet .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Takk!
Kommentarer
Svar
Hvordan du har gjort det for det enkle eksemplet, er nøyaktig hvordan jeg ville gjort det. Jeg kan bruke groupBy
hvis jeg hadde å gjøre med et mer 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 koden din går du to ganger over listen din (en gang for metoden List.max
og en gang for metoden List.findAll
). Dette er selvfølgelig akseptabelt, hvis du bare har en liten liste. Hvis listen din er veldig stor , bør du gå gjennom den bare en gang.
Når listen din bare inneholder primitiver, er det nok å lagre maksimum og antall av dette maksimumet i en variabel, for å gå gjennom listen og oppdatere begge variablene :
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
Koden ovenfor har selvfølgelig flere linjer enn din, men skal være raskere for veldig store lister.
Ans wer
Jeg synes denne måten er den mest praktiske:
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 synd at Groovy gjør det vanskelig for meg å finne eller sjekke element fra en liste over heltall i stedet for å bruke
sess.find(valuetobefound)
enn
sess.find{it==valuetobefound}
v.findAll { it == v.max() }