尝试使用mergesort对字符串列表进行排序。我的问题是我不知道如何比较字符串的第一个字母。
我的想法是这样但这会导致两个问题:
merge([],X) -> X;
merge(X,[]) -> X;
merge([X|XS],[Y|YS]) when check_swap(X,Y)-> [X] ++ merge(XS,[Y|YS]);
merge([X|XS],[Y|YS]) -> [Y] ++ merge([X|XS], YS).
sort([]) -> [];
sort([A|[]])-> [A];
sort (L) -> Len=length(L) div 2,
merge(sort(lists:sublist(L, Len)),sort(lists:nthtail(Len, L))).
%check if strings should be swaped or not
change_strings(StingA,StringB) when lists:nth(1,StingA)<lists:nth(1,StringB)->true;
....
问题是我无法在if,case或if之后调用函数。有什么更好的方法呢?
./ textSort.erl:28:调用本地/导入函数check_swap / 2是非法的后卫
问题:如何将各种条件与AND和OR结合起来。我什么时候使用“,;或者和orelse andalso”,我怎样才能像其他语言一样用()命令将它们组合起来?是否有更好的方法
当(A change_strings(X,Y); (A&lt; B,B == 4) - &gt;真正;可能很容易失败。刚从erlang开始。
答案 0 :(得分:1)
1)只需提前一步调用该函数
X1 = change_strings(X),
if
X1 == true ->
doSomething();
true ->
doSomethingElse()
end
答案 1 :(得分:0)
2)你可以这样做:
change_strings(X,Y) when (A < B and B==3) or (A < B and B==4) -> true;
在其他情况下,您可以使用开关案例
答案 2 :(得分:0)
您不需要比较字符串的第一个字母,因为您可以在字符串上使用关系运算符:
1> "a" < "b".
true
2> "b" < "a".
false
但是,如果你想比较一个字符串的第一个字母,记住一个字符串只是一个列表,所以你可以使用cons运算符进行模式匹配,就像任何列表一样:
get_first_letter([[FirstLetter|FirstString]|Rest]) -> FirstLetter.
1> whatever:get_first_letter(["Hello", "There"]).
72
72是'H'的ASCII值(如果支持其他字符集,则可能具有不同的值)。您现在可以在警卫中使用FirstLetter,例如
get_first_letter([[FirstLetter|FirstString]|Rest]) when FirstLetter == $H -> FirstLetter.
现在get_first_letter只会匹配第一个字符串的第一个字母是H.注意上面的例子假设一个字符串列表;你可以很容易地推断一个接受两个字符串列表的函数。