1

だから私は2つのデータベースを作りました:

  1. 以下を含むDb1:[{james,london}]
  2. 以下を含むDb2:[{james,london},{fredrik,berlin},{fred,berlin}]

私は次のような一致関数を持っています:

match(Element, Db) -> proplists:lookup_all(Element, Db).

私がするとき:match(berlin, Db2)私は得る:[ ]

私が取得しようとしているのは、この方法で値を入力してキーを取得する方法です。[fredrik,fred]

4

2 に答える 2

1

ドキュメントに関しては、proplists:lookup_all他の方法で動作します:

Returns the list of all entries associated with Key in List.

したがって、キーでのみ検索できます。

(kilter@127.0.0.1)1> Db = [{james,london},{fredrik,berlin},{fred,berlin}].
[{james,london},{fredrik,berlin},{fred,berlin}]
(kilter@127.0.0.1)2> proplists:lookup_all(berlin, Db). 
[]
(kilter@127.0.0.1)3> proplists:lookup_all(fredrik, Db).
[{fredrik,berlin}]

代わりにlists:filterandを使用できます。lists:map

(kilter@127.0.0.1)7> lists:filter(fun ({K, V}) -> V =:= berlin end, Db).       
[{fredrik,berlin},{fred,berlin}]
(kilter@127.0.0.1)8> lists:map(fun ({K,V}) -> K end, lists:filter(fun ({K, V}) -> V =:= berlin end, Db)).
[fredrik,fred]

では、最後に

match(Element, Db) -> lists:map(
    fun ({K,V}) -> K end, 
    lists:filter(fun ({K, V}) -> V =:= Element end, Db)
).
于 2012-10-11T00:21:23.957 に答える
0

proplists:lookup_all/2最初の引数としてキーを取ります。あなたの例でberlinは、値であり、キーではないため、空のリストが返されます。

当然のことながら、再帰を使用してすべての要素を見つけることができます (つまり、proplist ではなく通常のリストのように使用します)。

別の解決策は、エンコード スキームを変更することです。

[{london,james},{berlin,fredrik},{berlin,fred}]

そして使用するproplists:lookup_all/2

それをエンコードする正しい方法は、データにアクセスする方法 (最も実行する「クエリ」の種類) によって異なります。しかし、大量のデータを操作しない限り (その場合、他のデータ構造を使用したい場合があります)、分析する価値はありません。

于 2012-10-11T00:22:15.483 に答える