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

  • Käytä sisäistä menetelmää: v.findAll { it == v.max() }
  • @ArturoHerrero suorittaako max () -menetelmän kullekin luettelon elementille? tai kääntäjä optimoi sen löytääkseen maksimin vain kerran ja verrattaakseen sitten kuhunkin elementtiin?

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} 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *