Vergleich der Listenlänge

8

Ich habe eine Liste von Listen, sagen wir:

%Vor%

Ich möchte die innere Liste mit den meisten Elementen erhalten, in diesem Fall [1,2,3] .

Ich versuche, die Funktion maximumBy aus der Data.List -Bibliothek zu verwenden:

%Vor%

aber ich bekomme den folgenden Fehler: not in scope 'on'

Kann jemand mir sagen, was falsch ist, oder wenn Sie einen besseren Weg haben, die Liste zu bekommen?

    
KevinCameron1337 11.10.2011, 17:41
quelle

5 Antworten

8

on ist in Data.Function definiert , also müssen Sie das importieren.

Alternativ können Sie comparing von verwenden Data.Ord :

%Vor%     
interjay 11.10.2011, 17:50
quelle
7

Bei der Verwendung von maximumBy mit comparing length oder compare 'on' length wird der Job für kurze Listen problemlos ausgeführt. Beachten Sie, dass dies keine sehr effiziente Lösung ist, wenn die Listen lang sind, da der Algorithmus jedes Mal zwei Listen vergleicht. es wird ihre Längen neu berechnen.

Wenn wir zum Beispiel eine sehr lange erste Liste gefolgt von vielen kurzen Listen haben, wird die Verwendung von maximumBy sehr langsam sein, da die Länge der ersten Liste bei jedem Schritt neu berechnet wird.

%Vor%

Wir können eine effizientere Lösung finden, indem wir die Längen der Listen zwischenspeichern:

%Vor%

Natürlich macht das keinen großen Unterschied, wenn Ihre Listen klein sind, aber es lohnt sich, es zu beachten.

    
hammar 11.10.2011 18:09
quelle
3

oder Sie können es etwas expliziter machen:

%Vor%

vielleicht ist es einfacher, so zu verstehen.

    
Carsten 11.10.2011 17:51
quelle
3

Versuchen Sie

%Vor%

oder

%Vor%

oder

%Vor%     
phimuemue 11.10.2011 17:49
quelle
1

Inspiriert von hammars Lösung, aber mit nur einem Durchlauf durch die Liste:

%Vor%     
Landei 12.10.2011 07:19
quelle

Tags und Links