Ausgehend von einer sortierten Abfolge von Werten ist es mein Ziel, jedem Wert einen Rang zuzuordnen, wobei gleiche Ränge für gleiche Werte (aka ties) verwendet werden:
Eingabe: Vector(1, 1, 3, 3, 3, 5, 6)
Ausgabe: Vector((0,1), (0,1), (1,3), (1,3), (1,3), (2,5), (3,6))
Einige Typen geben Aliase für die Lesbarkeit an:
%Vor% Eine imperative Implementierung mit einer veränderbaren rank
-Variable könnte folgendermaßen aussehen:
Um meine FP-Fähigkeiten zu verbessern, habe ich versucht, eine funktionale Implementierung zu finden:
%Vor% Es ist weniger lesbar und - was noch wichtiger ist - es fehlt der letzte Wert (wegen der Verwendung von sliding(2)
bei einer ungeraden Anzahl von Werten).
Wie könnte dies behoben und verbessert werden?
Das funktioniert gut für mich:
%Vor%Das gleiche in Java 8 mit Javaslang:
%Vor%Die Ausgabe beider Varianten ist
%Vor%*) Offenlegung: Ich bin der Schöpfer von Javaslang
Hier ist ein Ansatz mit Rekursion, Mustererkennung und Wachen.
Der interessante Teil ist, wo Kopf und Kopf des Schwanzes ( h
bzw. ht
) von der Liste dekonstruiert werden und ein if
prüft, ob sie gleich sind. Die Logik für jeden Fall passt den Rang an und fährt mit dem verbleibenden Teil der Liste fort.
Ausgabe:
%Vor%Dies ist eine Modifikation der Lösung von @jwvh, die keine Annahmen über die Werte macht:
%Vor% Beachten Sie, dass es ausgegeben würde, wenn vs
leer ist, also müssten Sie vs.headOption getOrElse 0
verwenden oder prüfen, ob die Eingabe vorher leer ist: if (vs.isEmpty) Vector.empty else ...
Tags und Links scala functional-programming