2016-06-30 14 views
-3

私はその後、私は「何falseアーランは:重複した要素をチェック

を返す{Jid, Text}を読み込む機能を作成し、それがリストのリターン他trueですでにだ場合、それはリストに追加する必要があり、この機能がないかどうかを確認しようとしていますメートルやっては以下のとおりです。

new_seen() -> [{"[email protected]", "hello"}]. 

check({Jid, Text}) -> 
    Term = {Jid, Text}, 
    case lists:member(Term, new_seen()) of 
     true -> true; 
     false -> 
      %% here I want to add {Jid, Text} to new_seen() list. 
      false 
    end. 

簡単な例:

check({"[email protected]", "hi"}). 
%% here should appened {"[email protected]", "hi"} to the list and return false. 


%% if I run function again : 
check({"[email protected]", "hi"}). 

%% here should return True cuz {"[email protected]", "hi"} in the list. 

私はDUPLかどうかを確認するためにejabberdでそれを使用したいですメッセージが挿入されます。

+1

あなたのニーズは?そのリストに保持する必要があるデータは何ですか?それは大きなデータベースですか?おそらく[Erlang ETS](http://erlang.org/doc/man/ets.html)や[プロセス辞書](http://erlang.org/doc/reference_manual/processes.html#id87983)をチェックしたいと思うでしょう。 ) –

+0

@A.Saridはいそれは大きなデータベースです。はい、私はetsを使うべきではありません。私もここで尋ねた: http://stackoverflow.com/questions/35958767/erlang-check-duplicate-inserted-elements これを行う方法はありますか? –

+0

あなたの前の質問に答えがあるようです。だから、あなたのデータベースにETSを使わないのはなぜですか?大きなデータベースにはちょうど適合するはずです。 –

答えて

1

mnesia(Kev/Value Storage)のような別のデータベースもチェックしましたか?たぶん彼らは のように見えますmapのように思われます。特定のキーの値にアクセスできます。これについてはlearnyousomeerlangもチェックしてください。

リストが必要な場合は、要素を追加するだけです。あなたのコードで:

check({Jid, Text}) -> 
    Term = {Jid, Text}, 
    case lists:member(Term, new_seen()) of 
     true -> true; 
     false -> 
      %% here I want to add {Jid, Text} to new_seen() list. 
      NewList = [Term|new_seen()] 
    end, 
NewList. 

あなたは、あなたのnew_seen()関数でリストを更新することができないので、新しいリストを返し、どこか別の場所にそれを保存する必要があります。 本当にtrueを返す必要がある場合は、これを最後の行に入れます:{true, NewList}これはtrueと新しいリストを含むタプルを返します。

+0

真実ですが、データベースが必要な場合は、このリストを関数 'check({Jid、Text}、Database)'に別のパラメータとして追加する必要があります。 'new_seen()'を呼び出す代わりに 'Database'を使います。 –