Existuje nějaký jednodušší způsob, jak najít všechny prvky v seznamu, které se rovnají maximálnímu prvku .

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

Díky!

Komentáře

  • Použijte inline metodu: v.findAll { it == v.max() }
  • @ArturoHerrero by to provedlo metodu max () pro každý prvek v seznamu? nebo by to překladač optimalizoval tak, aby našel maximum pouze jednou a poté porovnal s každým prvkem?

Odpovědět

Jak jste to udělali pro jednoduchý příklad, je přesně to, jak bych to udělal. Mohu použít groupBy, pokud mám co do činění se složitějším objektem.

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

Odpověď

V kódu přejdete seznamem dvakrát (jednou pro metodu List.max a jednou pro metodu List.findAll). To je samozřejmě přijatelné, pokud máte jen malý seznam. Pokud je váš seznam velmi velký , měli byste to projít jen jednou.

Pokud váš seznam obsahuje pouze primitiva, stačí uložit maximum a počet tohoto maxima do jedné proměnné, projít seznamem a aktualizovat obě proměnné :

 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 

Výše uvedený kód má samozřejmě více řádků než váš, ale u velmi velkých seznamů by měl být rychlejší.

Odpovědi wer

Myslím, že tento způsob je nejvhodnější:

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 

odpověď

Je škoda, že Groovy mi dovoluje najít nebo zkontrolovat prvek ze seznamu celých čísel namísto použití

 sess.find(valuetobefound) 

než

 sess.find{it==valuetobefound} 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *