lists:keysort/3
对元组列表进行排序
用法:
keysort(N, TupleList1) -> TupleList2
内部实现:
-spec keysort(N, TupleList1) -> TupleList2 when N :: pos_integer(), TupleList1 :: [Tuple], TupleList2 :: [Tuple], Tuple :: tuple(). keysort(I, L) when is_integer(I), I > 0 -> case L of [] -> L; [_] -> L; [X, Y | T] -> case {element(I, X), element(I, Y)} of {EX, EY} when EX =< EY -> case T of [] -> L; [Z] -> case element(I, Z) of EZ when EY =< EZ -> L; EZ when EX =< EZ -> [X, Z, Y]; _EZ -> [Z, X, Y] end; _ when X == Y -> keysort_1(I, Y, EY, T, [X]); _ -> keysplit_1(I, X, EX, Y, EY, T, [], []) end; {EX, EY} -> case T of [] -> [Y, X]; [Z] -> case element(I, Z) of EZ when EX =< EZ -> [Y, X | T]; EZ when EY =< EZ -> [Y, Z, X]; _EZ -> [Z, Y, X] end; _ -> keysplit_2(I, X, EX, Y, EY, T, [], []) end end end. keysort_1(I, X, EX, [Y | L], R) when X == Y -> keysort_1(I, Y, EX, L, [X | R]); keysort_1(I, X, EX, [Y | L], R) -> case element(I, Y) of EY when EX =< EY -> keysplit_1(I, X, EX, Y, EY, L, R, []); EY -> keysplit_2(I, X, EX, Y, EY, L, R, []) end; keysort_1(_I, X, _EX, [], R) -> lists:reverse(R, [X]).
对元组列表 TupleList1 里按元组的第 N 个值进行排序,最后返回排序后的新元组列表 TupleList2
TupleList = [{a, 3}, {b, 4}, {c, 1}, {d, 2}], lists:keysort(2, TupleList).