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} 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.