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

  • Utilizați o metodă în linie: v.findAll { it == v.max() }
  • @ArturoHerrero ar executa metoda max () pentru fiecare element din listă? sau compilatorul ar optimiza asta pentru a găsi maximul o singură dată și apoi pentru a compara cu fiecare element?

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} 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *