Există vreo modalitate mai simplă de a găsi toate elementele dintr-o listă care sunt egale cu elementul max .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Mulțumesc!
Comentarii
Răspuns
Modul în care l-ați făcut pentru exemplul simplu este exact cum aș face-o. Aș putea folosi groupBy
dacă aveam de-a face cu un obiect mai complex.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Răspuns
În codul dvs. treceți de două ori peste lista dvs. (o dată pentru metoda List.max
și o dată pentru metoda List.findAll
). Desigur, acest lucru este acceptabil, dacă aveți doar o listă mică. Dacă lista dvs. este foarte mare , ar trebui să o parcurgeți o singură dată.
Când lista dvs. conține doar primitive, este suficient să stocați maximul și numărul acestui maxim într-o singură variabilă, să parcurgeți lista și să actualizați ambele variabile :
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
Desigur, codul de mai sus are mai multe linii decât ale dvs., dar ar trebui să fie mai rapid pentru listele foarte mari.
Răspuns wer
Cred că acest mod este cel mai convenabil:
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
Răspuns
Este păcat că Groovy îmi face dificil să găsesc sau să verific element dintr-o listă de numere întregi în loc să folosesc
sess.find(valuetobefound)
decât
sess.find{it==valuetobefound}
v.findAll { it == v.max() }