0

文字列のリストをmergesortでソートしようとしています。私の問題は、文字列の最初の文字を比較する方法がわからないことです。

私の考えはこれでしたが、これは2つの問題につながります:

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) when (A < B,B==3) ; (A < B,B==4) -> 真;

簡単に失敗しますように。erlang を始めたばかりです。

4

3 に答える 3

1

1)関数を1ステップ前に呼び出すだけです

X1 = change_strings(X),
if
    X1 == true ->
        doSomething();
    true ->
        doSomethingElse()
end
于 2012-12-17T17:15:31.887 に答える
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の場合にのみ一致します。上記の例では、文字列の単一のリストを想定していることに注意してください。文字列の2つのリストを受け入れる関数を簡単に推定できます。

于 2012-12-18T23:19:39.217 に答える
0

2)これを行うことができます:

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

それ以外の場合は、スイッチケースを使用できます

于 2012-12-17T17:18:42.137 に答える