Van-e valamilyen egyszerűbb módszer arra, hogy megtalálja a lista összes elemét, amely megegyezik a max elemmel .

List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max } 

Köszönöm!

Megjegyzések

  • Használjon belső módszert: v.findAll { it == v.max() }
  • @ArturoHerrero végrehajtaná a max () metódust a lista minden eleméhez? vagy a fordító ezt optimalizálná, hogy csak egyszer találja meg a maximumot, majd összehasonlítsa az egyes elemekkel?

Válasz

Hogyan csináltad az egyszerű példához, pontosan hogyan csinálnám. Használhatom a groupBy t, ha összetettebb objektummal volt dolgom.

 List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results 

Válasz

A kódodban kétszer lépsz át a listádon (egyszer a List.max és egyszer a List.findAll módszerhez. Természetesen ez elfogadható, ha csak egy kis listád van. Ha a listád nagyon nagy , csak egyszer kell átélned.

Ha a listád csak primitíveket tartalmaz, akkor elegendő a maximumot és a maximumot egy változóban tárolni, végigmenni a listán és frissíteni mindkét változót :

 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 

Természetesen a fenti kódnak több sora van, mint a tiednek, de nagyon nagy listák esetén gyorsabbnak kell lennie.

Ans wer

Szerintem ez a legkényelmesebb módszer:

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 

válasz

Kár, hogy Groovy diffucltá teszi számomra, hogy az egész számok listájából elemet találjak vagy ellenőrizzek a

mint

 sess.find{it==valuetobefound} 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük