内置 sort/4 的快速替代品
Fast alternative to built-in sort/4
我正在寻找 sort/4
的替代品。我目前无法使用内置版本。
如果可用,我需要的语法将如下所示 sort(1, @>=, List, Sorted)
。列表中的元素如下所示 ([Value:x:y,z:a]:[], ...)
。结果必须根据 Value 参数按降序排序。
用于测试目的的示例列表:
[ [16:x:y,z:a]:[], [64:x:y,z:a]:[], [4:x:y,z:a]:[], [1024:x:y,z:a]:[], [0:x:y,z:a]:[], [100:x:y,z:a]:[], [50:x:y,z:a]:[], [-100:x:y,z:a]:[], [0:x:y,z:a]:[] ]
只需提取密钥,将其放在结构的前面,调用 sort/2(或 msort/2,以避免丢失重复项),然后从排序列表中删除密钥。
相同的代码(列表访问)可用于将密钥放在前面和将其删除。最后一步将反转列表,以降序排列。
alternative_sort(Structs, Sorted) :-
structs_keyed(Structs, Keyed),
sort(Keyed, Temp),
structs_keyed(TempR, Temp),
reverse(TempR, Sorted).
structs_keyed(Sorted, Temp) :- % assume library(yall) available
maplist([S,K]>>(S=([Value|_]:_),K=Value/S), Sorted, Temp).
是真的,因为排序键值是第一个值元素,可以减少到
alternative_sort(Structs, Sorted) :-
sort(Structs, Ascending),
reverse(Ascending, Sorted).
我正在寻找 sort/4
的替代品。我目前无法使用内置版本。
如果可用,我需要的语法将如下所示 sort(1, @>=, List, Sorted)
。列表中的元素如下所示 ([Value:x:y,z:a]:[], ...)
。结果必须根据 Value 参数按降序排序。
用于测试目的的示例列表:
[ [16:x:y,z:a]:[], [64:x:y,z:a]:[], [4:x:y,z:a]:[], [1024:x:y,z:a]:[], [0:x:y,z:a]:[], [100:x:y,z:a]:[], [50:x:y,z:a]:[], [-100:x:y,z:a]:[], [0:x:y,z:a]:[] ]
只需提取密钥,将其放在结构的前面,调用 sort/2(或 msort/2,以避免丢失重复项),然后从排序列表中删除密钥。
相同的代码(列表访问)可用于将密钥放在前面和将其删除。最后一步将反转列表,以降序排列。
alternative_sort(Structs, Sorted) :-
structs_keyed(Structs, Keyed),
sort(Keyed, Temp),
structs_keyed(TempR, Temp),
reverse(TempR, Sorted).
structs_keyed(Sorted, Temp) :- % assume library(yall) available
maplist([S,K]>>(S=([Value|_]:_),K=Value/S), Sorted, Temp).
是真的,因为排序键值是第一个值元素,可以减少到
alternative_sort(Structs, Sorted) :-
sort(Structs, Ascending),
reverse(Ascending, Sorted).