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

  • Brug en integreret metode: v.findAll { it == v.max() }
  • @ArturoHerrero ville det udføre metoden max () for hvert element på listen? eller kompilatoren ville optimere det for kun at finde max en gang og derefter sammenligne med hvert element?

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} 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *