【问题标题】:erlang function calls after when to compare stringserlang函数在何时比较字符串之后调用
【发布时间】:2012-12-04 19:32:49
【问题描述】:

尝试使用合并排序对字符串列表进行排序。我的问题是我不知道如何比较字符串的第一个字母。

我的想法是这样的,但这会导致两个问题:

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. 问题是我无法在 when、case 或 if 之后调用函数。有什么更好的方法来做到这一点?

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

  2. 问题:如何将各种条件与 AND 和 OR 结合起来。我什么时候使用 ", ; or and orelse andalso" 以及如何像在其他语言中一样将它们与 () 顺序结合起来?有没有更好的办法

    change_strings(X,Y) 当 (A 真;

愿这很容易失败。刚开始使用 erlang。

【问题讨论】:

    标签: string function erlang compare mergesort


    【解决方案1】:

    你不需要比较字符串的第一个字母,因为你可以在字符串上使用关系运算符:

    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 时才会匹配。请注意,上面的示例假设一个字符串列表;您可以轻松推断出接受两个字符串列表的函数。

    【讨论】:

      【解决方案2】:

      2) 你可以这样做:

      change_strings(X,Y) when (A < B and B==3) or (A < B and B==4) -> true; 
      

      在其他情况下,您可以使用开关盒

      【讨论】:

        【解决方案3】:

        1) 只需提前一步调用函数

        X1 = change_strings(X),
        if
            X1 == true ->
                doSomething();
            true ->
                doSomethingElse()
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          相关资源
          最近更新 更多