Onko olemassa yksinkertaisempaa tapaa löytää kaikki luettelon elementit, jotka ovat yhtä suuria kuin suurin elementti .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Kiitos!
Kommentit
Vastaa
Kuinka olet tehnyt sen yksinkertaisessa esimerkissä, tarkalleen miten tekisin sen. Voin käyttää groupBy
, jos tekisin monimutkaisempaa objektia.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Vastaa
Koodissasi menet kaksi kertaa luettelosi yli (kerran menetelmä List.max
ja kerran menetelmälle List.findAll
). Tietenkin tämä on hyväksyttävää, jos sinulla on vain pieni luettelo. Jos luettelosi on hyvin suuri , sinun tulisi käydä se läpi vain kerran.
Kun luettelosi sisältää vain primitiivejä, riittää, että talletat maksimin ja määrän tämän maksimiin yhteen muuttujaan, käydään läpi luettelo ja päivitetään molemmat muuttujat :
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
Yllä olevassa koodissa on tietysti enemmän rivejä kuin sinun, mutta sen pitäisi olla nopeampi erittäin suurille listoille.
Ans wer
Luulen, että tämä on mukavin tapa:
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
vastaus
On häpeä, että Groovy saa minut diffucltiksi etsimään tai tarkistamaan elementti kokonaislukujen luettelosta sen sijaan, että käytän
sess.find(valuetobefound)
kuin
sess.find{it==valuetobefound}
v.findAll { it == v.max() }