erlang函数调用何时比较字符串

时间:2012-12-17 17:07:11

标签: string function erlang compare mergesort

尝试使用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;
....
  1. 问题是我无法在if,case或if之后调用函数。有什么更好的方法呢?

    ./ textSort.erl:28:调用本地/导入函数check_swap / 2是非法的后卫

  2. 问题:如何将各种条件与AND和OR结合起来。我什么时候使用“,;或者和orelse andalso”,我怎样才能像其他语言一样用()命令将它们组合起来?是否有更好的方法

    当(A change_strings(X,Y); (A&lt; B,B == 4) - &gt;真正;

  3. 可能很容易失败。刚从erlang开始。

3 个答案:

答案 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.注意上面的例子假设一个字符串列表;你可以很容易地推断一个接受两个字符串列表的函数。