Czy istnieje prostszy sposób na znalezienie wszystkich elementów na liście, które są równe elementowi max .
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Dzięki!
Komentarze
Odpowiedź
Sposób, w jaki zrobiłeś to w prostym przykładzie, jest dokładnie taki, jak ja bym to zrobił. Mogę użyć groupBy
, jeśli mam do czynienia z bardziej złożonym obiektem.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Odpowiedź
W swoim kodzie przechodzisz dwa razy przez listę (raz w przypadku metody List.max
i raz dla metody List.findAll
). Oczywiście jest to dopuszczalne, jeśli masz tylko małą listę. Jeśli Twoja lista jest bardzo duża , powinieneś przejść przez to tylko raz.
Kiedy twoja lista zawiera tylko prymitywy, wystarczy zapisać maksimum i liczbę tego maksimum w jednej zmiennej, aby przejrzeć listę i zaktualizować obie zmienne :
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
Oczywiście powyższy kod ma więcej wierszy niż twój, ale powinien być szybszy w przypadku bardzo dużych list.
Ans wer
Myślę, że ten sposób jest najwygodniejszy:
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
Odpowiedź
Szkoda, że Groovy sprawia, że trudno mi znaleźć lub sprawdzić element na liście liczb całkowitych zamiast używać
sess.find(valuetobefound)
niż
sess.find{it==valuetobefound}
v.findAll { it == v.max() }