2012-12-17 41 views
0

嘗試使用mergesort對字符串列表進行排序。我的問題是我不知道如何比較字符串的第一個字母。在比較字符串的時候調用erlang函數

我的想法是這樣的,但是這會導致兩個問題:

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. 問題是,我不能打電話的時候後,情況或如果一個函數。有什麼更好的方法來做到這一點?

    ./textSort.erl:28:撥打本地/進口功能check_swap/2是在後衛非法

  2. 的問題:我如何可以結合使用AND和OR各種條件。我什麼時候使用「,; orl orelse andalso」,以及如何將它們與其他語言結合使用()命令?有沒有更好的辦法做

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

可能是其容易失敗。剛剛開始在erlang。

回答

1

1)只需要調用前面的函數一步

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

2)你可以這樣做:

change_strings(X,Y) when (A < B and B==3) or (A < B and B==4) -> true; 
在其他情況下

你可以使用一個開關的情況下

0

你不」 t需要比較字符串的第一個字母,因爲您可以在字符串上使用關係運算符:

1> "a" < "b". 
true 
2> "b" < "a". 
false 

但是,如果你想比較字符串的第一個字母,請記住,一個字符串就是一個列表,這樣你就可以使用利弊運營商做的模式匹配與任何名單:

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如果第一個字符串的第一個字母是閣下注意,上面的例子假設字符串的一個列表將只匹配;您可以輕鬆推斷出接受兩個字符串列表的函數。