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

  • Użyj metody wbudowanej: v.findAll { it == v.max() }
  • @ArturoHerrero czy wykonanie metody max () dla każdego elementu na liście? czy kompilator zoptymalizowałby to, aby znaleźć maksimum tylko raz, a następnie porównać z każdym elementem?

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} 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *