문제
각 튜플의 두 번째 요소에 따라 튜플을 정렬해야하지만 분명히 USORT/1은 첫 번째 요소와 만 작동합니다. 그래서 나는 요소를 교환하고, 그것들을 사용하고, 다시 교체해야합니까? 더 쉬운 방법이 있습니까? 또한 내림차순으로 정렬 할 수있는 방법이 있습니까 (정렬과 반전이 수행 될 수는 있지만 알고 싶다는 것을 알고 있습니다).
해결책
당신은 시도 했습니까? 키 소트/2 기능 (또는 그 상대 ukeysort/2)?
> lists:reverse(lists:keysort(2, [{a,2}, {b,1}, {c, 3}])).
[{c,3},{a,2},{b,1}]
큰 목록을 정렬하지 않으면 아마도 가장 읽기 쉬운 솔루션 일 것입니다.
다른 팁
실제로 더 나은 답변 :
정렬 기능을 취하는 두 번째 버전의 종류가 있습니다.
lists:sort(Fun, List1) -> List2
다음은 튜플의 두 번째 요소를 정렬하는 예입니다.
lists:sort(fun(A, B) ->
{A1, A2} = A,
{B1, B2} = B,
if
A2 > B2 ->
false;
true ->
true
end
end, YourList).
BMDHacks 솔루션의 개선 된 버전 :
lists:sort(fun(A, B) ->
{_, A2} = A,
{_, B2} = B,
A2 =< B2
end, YourList).
컴파일러는 A1과 B1보다 밑줄이 더 좋습니다. 컴파일러는 그에 대한 경고를 제공하기 때문입니다.
내림차순으로 정렬하려면 <= to> =를 변경하십시오.
자신의 정렬 기능을 작성하는 것은 너무 어렵지 않아야합니다 (공통 예에서 적응) :
qsort([]) -> [];
qsort([Pivot|Tail]) ->
{PivotFirst, PivotSecond} = Pivot,
qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement < PivotSecond])
++ [Pivot] ++
qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement >= PivotSecond]).
제휴하지 않습니다 StackOverflow