Gibt es eine einfachere Möglichkeit, alle Elemente in einer Liste zu finden, die dem maximalen Element entsprechen?
List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max }
Danke!
Kommentare
- Verwenden Sie eine Inline-Methode:
v.findAll { it == v.max() }
- @ArturoHerrero würde das die max () -Methode für jedes Element in der Liste ausführen? oder würde der Compiler das optimieren, um das Maximum nur einmal zu finden und dann mit jedem Element zu vergleichen?
Antwort
Wie Sie es für das einfache Beispiel getan haben, ist genau so, wie ich es tun würde. Ich kann groupBy
verwenden, wenn ich mich mit einem komplexeren Objekt befasse.
List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results
Antwort
In Ihrem Code gehen Sie zweimal durch Ihre Liste (einmal für die Methode List.max
und einmal für die Methode List.findAll
). Dies ist natürlich akzeptabel, wenn Sie nur eine kleine Liste haben. Wenn Ihre Liste sehr groß ist Sie sollten es nur einmal durchgehen.
Wenn Ihre Liste nur Grundelemente enthält, reicht es aus, das Maximum und die Anzahl dieses Maximums in einer Variablen zu speichern, die Liste durchzugehen und beide Variablen zu aktualisieren :
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
Natürlich enthält der obige Code mehr Zeilen als Ihre, sollte aber bei sehr großen Listen schneller sein.
Ans wer
Ich denke, dieser Weg ist der bequemste:
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
Antwort
Es ist eine Schande, dass Groovy es mir schwer macht, Elemente aus einer Liste von Ganzzahlen zu finden oder zu überprüfen, anstatt
als
sess.find{it==valuetobefound}