如果我有一个包含123.1234,abc
和321.321,qwe
的列表,我如何只按浮点值对列表进行排序?
我尝试使用sort/4
,但它不起作用。是否可以使用其他类似键盘?
?- sort(["10.29127443524318,F","5.968607804131937,A"],LL).
LL = ["10.29127443524318,F", "5.968607804131937,A"].
当我做上述排序时,它给了我错误的答案。
答案 0 :(得分:0)
排序是整数和浮点数的数字,字符串是字符串(因此在您的示例中排序是正确的,因为" 1"按字母顺序排列" 5")。
您可以将字符串转换为数字,但如果字符串中存在非数字部分(例如示例中为,F
),则会导致错误。
因此,您需要先拆分字符串,然后对生成的子字符串列表进行排序。对于列表列表,在内部列表的第一个元素上执行排序,然后在第一个元素相等的情况下执行第二个元素,等等。
排序后,子串可以再次连接。这里可以在串联期间隐式执行从数字到字符串的转换。
分裂,数字转换和重组可以用Prolog基本的递归方式完成。
MWE:
sort_compound(L1,LL) :-
split_compound(L1,L2),
sort(L2,L3),
recombine(L3,LL).
split_compound([H|T],[[N,L2]|T2]) :-
split_string(H,",","",[H1,L2]),
number_string(N,H1),
split_compound(T,T2).
split_compound([],[]).
recombine([[A,B]|T],[C|T2]) :-
atomics_to_string([A,',',B],C),
recombine(T,T2).
recombine([],[]).
结果:
?- sort_compound(["10.29127443524318,F","5.968607804131937,A"],LL).
LL = ["5.968607804131937,A", "10.29127443524318,F"].
请注意,有几个SWI-Prolog特定谓词用于数据类型转换,因此对于其他解释器,这需要进行调整。