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

  • Använd en inbyggd metod: v.findAll { it == v.max() }
  • @ArturoHerrero skulle det exekvera metoden max () för varje element i listan? eller skulle kompilatorn optimera det för att bara hitta max en gång och sedan jämföra med varje element?

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} 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *