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
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}
v.findAll { it == v.max() }