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).

War es hilfreich?

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]).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top