3

リストの erlang リストがあるとします。

リストのサイズは固定されていることに注意してください。この場合は 3.

A = [[1,2,3],[4,5,6],[1,8,3],[1,9,3]]

フォームのすべての要素を削除する関数を作成しようとしています[1,_,3]。したがって、期待される出力は次の形式になります。[[4,5,6]]

私が考えることができる1つの解決策は、dropwhile()使用できるリスト:関数でした。

述語関数の作成に問題があります。すべての要素をタプルに変換してから比較する方が簡単ですか? もしそうなら、中間要素を省略できる適切な方法はありません。

解決策にたどり着くのを手伝ってもらえますか? 他の効率的なアプローチも高く評価されます。

前もって感謝します!

編集:質問拡張:

リストの 2 つの erlang リストを想定します。

A = [[1,2,3]、[2,3,4]、[4,5,6]]

B = [[1,4,3]、[4,7,6]、[7,8,9]、[4,9,7]、]

出力 F(A,B) = [[7,8,9], [4,9,7]]

F は、リスト A の 1 番目と 3 番目の位置にある要素のいずれかに一致するすべての要素をリスト B から削除する関数として定義されています。

この場合、[1, _ ,3] または [2, _ , 4] または [4 , _ , 6] に一致するリスト B のすべての要素がリストから削除され、結果のリストが得られます。

Fを書くのに苦労しています。

4

3 に答える 3

12

フィルター関数には助けが必要です。

lists:filter(fun([1, _, 3]) -> false; (_) -> true end,
             [[1,2,3],[4,5,6],[1,8,3],[1,9,3]]).

これを機能させるには、関数ヘッドで一致が必要です。


複数のフィルターを使用する場合は、funs のマップを使用できます (テストされていません)。

composed_filter(Tests, Input) ->
  lists:filter(fun(X) -> lists:all([F(X) || F <- Tests]) end,
               Input).

複数のフィルターを使用するには、次のことができます。

filter(fun([1,_,3]) -> true;
          ([5,_,7]) -> true;
          ([9,_,13]) -> true;
          (_) -> false end, Input)
% or
composed_filter([fun([1,_,3]) -> true; (_) -> false end,
                 fun([5,_,7]) -> true; (_) -> false end,
                 fun([9,_,13]) -> true; (_) -> false end],
                Input)

ただし、プログラム可能な動的コンポーザビリティが必要でない限り、おそらく最初のものを使用する必要があります。もう 1 つの方法は、専用の composer_filter を使用するのではなく、関数を使用して構成を実行することです。これは、Haskell クラウドが好む、よりコンビネータ スタイルのアプローチです。上記の関数は若干異なることに注意してください。前者にはorelseセマンティクスがあり、後者にはandalsoセマンティクスがあります。つまり、最初のケースでは、1 つ以上のパターンが一致した場合に要素を取得しますが、後者のケースでは、すべてのパターン/ファンが一致した場合にのみ結果を取得します。lists:any/2を取得するために使用できますcomposed_any_filter

于 2012-12-07T15:52:21.013 に答える
3

dropWhileリストのプレフィックスしか返せないため、機能しません。filter代わりに使用してください。

于 2012-12-07T14:57:10.213 に答える
1

拡張された質問の解決策を思いつくことができました:

問題の A と B が与えられた場合:

F(A,B) ->
    lists:filter(fun(X) -> predicate(X,B) end, A).

predicate(X, B) ->
    Xr = lists:delete(lists:nth(2,X),X),
    Br = lists:map(lists:delete(lists:nth(2,Y),Y),B),
    lists:member(Xr, Br).

このリストライブラリはとてもクールです.. :)

于 2012-12-11T05:32:33.820 に答える