Is er een eenvoudigere manier om alle elementen in een lijst te vinden die gelijk zijn aan het max element .

List v = [ 1,2,3,4,5,5 ] def max = v.max() def maxs = v.findAll { it == max } 

Bedankt!

Reacties

  • Gebruik een inline-methode: v.findAll { it == v.max() }
  • @ArturoHerrero zou dat de max () – methode uitvoeren voor elk element in de lijst? of zou de compiler dat optimaliseren om het maximum slechts één keer te vinden en dan met elk element te vergelijken?

Answer

Hoe je het hebt gedaan voor het eenvoudige voorbeeld is precies hoe ik het zou doen. Ik kan groupBy gebruiken als ik te maken had met een complexer object.

 List v = [ 1,2,3,4,5,5 ] def max = v.max() def results = v.groupBy {it}.get(max) assert [5,5] == results 

Antwoord

In je code ga je twee keer over je lijst heen (een keer voor de methode List.max en een keer voor de methode List.findAll). Dit is natuurlijk acceptabel, als je maar een kleine lijst hebt. Als je lijst erg groot is , je zou het maar één keer moeten doorlopen.

Als je lijst alleen primitieven bevat, is het voldoende om het maximum en de telling van dit maximum in één variabele op te slaan, om de lijst te doorlopen en beide variabelen bij te werken :

 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 

Natuurlijk heeft de bovenstaande code meer regels dan de jouwe, maar zou sneller moeten zijn voor zeer grote lijsten.

Ans wer

Ik denk dat deze manier de handigste is:

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 

Antwoord

Het is jammer dat Groovy het voor mij moeilijk maakt om elementen uit een lijst met gehele getallen te vinden of te controleren in plaats van

 sess.find(valuetobefound) 

dan

 sess.find{it==valuetobefound} 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *