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

  • Bruk en innebygd metode: v.findAll { it == v.max() }
  • @ArturoHerrero ville det utført max () -metoden for hvert element i listen? eller kompilatoren vil optimalisere det for å finne maks bare en gang og deretter sammenligne med hvert element?

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} 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *