Listen: usort für n-te Element in Tupels
Frage
Ich brauche Tupel zu sortieren nach dem zweiten Element jedes Tupel aber usort scheinbar / 1 nur mit dem ersten Element funktioniert. Also muss ich die Elemente austauschen, usort sie und Swap back.Is es einen einfacheren Weg? Auch ist es eine Möglichkeit, in absteigender Reihenfolge zu sortieren (ich weiß, das Sortieren und die Umkehrung kann getan werden, aber nur wollen wissen).
Lösung
Haben Sie versucht, keysort / 2 Funktion (oder sein Pendant ukeysort / 2 )?
> lists:reverse(lists:keysort(2, [{a,2}, {b,1}, {c, 3}])).
[{c,3},{a,2},{b,1}]
Wenn Sie dies nicht tun Art sehr große Listen ist dies wahrscheinlich die meisten lesbare Lösung, die Sie bekommen können.
Andere Tipps
Eigentlich eine bessere Antwort:
Es gibt eine zweite Version der Art, die eine Sortierfunktion nimmt:
lists:sort(Fun, List1) -> List2
Hier ist ein Beispiel, das in einem Tupel auf dem zweiten Element sortiert:
lists:sort(fun(A, B) ->
{A1, A2} = A,
{B1, B2} = B,
if
A2 > B2 ->
false;
true ->
true
end
end, YourList).
Eine verbesserte Version von bmdhacks' Lösung:
lists:sort(fun(A, B) ->
{_, A2} = A,
{_, B2} = B,
A2 =< B2
end, YourList).
Unterstreichungen sind besser als A1 und B1, da die Compiler-Warnungen geben für diejenigen.
So sortiert in absteigender Reihenfolge, ändern Sie einfach <= zu> =.
Es sollte nicht allzu schwer sein, eigene Sortierfunktion zu schreiben (von einem gemeinsamen Beispiel angepasst):
qsort([]) -> [];
qsort([Pivot|Tail]) ->
{PivotFirst, PivotSecond} = Pivot,
qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement < PivotSecond])
++ [Pivot] ++
qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement >= PivotSecond]).