快速替代内置sort / 4

时间:2016-02-22 18:28:50

标签: sorting prolog code-snippets

我正在寻找format += "\"" + user + "\""; 的替代方案。我目前无法使用内置版本。

如果可用,我需要的语法将如下int[] anArray = new int[200]; for (int j = 0; j <anArray.length; j++) { anArray[j] = 500 + j; } 。列表中的元素看起来像sort/4。结果必须根据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]:[]]

1 个答案:

答案 0 :(得分:2)

只需提取密钥,将其放在结构前面,调用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).