Finns det något enklare sätt att hitta alla element i en lista som är lika med maxelementet .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Tack!
Kommentarer
Svar
Hur du har gjort det för det enkla exemplet är exakt hur jag skulle göra det. Jag kan använda groupBy
om jag hade att göra med ett mer komplext 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 kod går du två gånger över din lista (en gång för metoden List.max
och en gång för metoden List.findAll
). Naturligtvis är det acceptabelt om du bara har en liten lista. Om din lista är mycket stor bör du gå igenom det bara en gång.
När din lista bara innehåller primitiva, räcker det att lagra maximalt och antalet av detta maximala i en variabel, för att gå igenom listan och uppdatera båda variablerna :
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
Naturligtvis har ovanstående kod fler rader än din, men bör vara snabbare för mycket stora listor.
Ans wer
Jag tycker att detta sätt är det mest praktiska:
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 är synd att Groovy gör det svårt för mig att hitta eller kontrollera element från en lista över heltal istället för att använda
sess.find(valuetobefound)
än
sess.find{it==valuetobefound}
v.findAll { it == v.max() }