所以我做了2个数据库:
- Db1 包含:
[{james,london}] - Db2 包含:
[{james,london},{fredrik,berlin},{fred,berlin}]
我有一个看起来像这样的匹配函数:
match(Element, Db) -> proplists:lookup_all(Element, Db).
当我这样做时:match(berlin, Db2)我得到:[ ]
我想要得到的是一种输入值并以这种方式取回密钥的方法:[fredrik,fred]
所以我做了2个数据库:
[{james,london}][{james,london},{fredrik,berlin},{fred,berlin}]我有一个看起来像这样的匹配函数:
match(Element, Db) -> proplists:lookup_all(Element, Db).
当我这样做时:match(berlin, Db2)我得到:[ ]
我想要得到的是一种输入值并以这种方式取回密钥的方法:[fredrik,fred]
关于文档的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:filterandlists: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)
).
proplists:lookup_all/2将键作为第一个参数;在您的示例中,berlin是一个值,它不是一个键,因此返回一个空列表。
自然地,您可以使用递归并找到所有元素(这意味着您将像使用普通列表而不是 proplist 一样使用它)。
另一种解决方案是更改编码方案:
[{london,james},{berlin,fredrik},{berlin,fred}]
然后使用proplists:lookup_all/2
对其进行编码的正确方法取决于您访问数据的方式(您将执行最多的“查询”类型);但除非您操作大量数据(在这种情况下您可能想要使用其他数据结构),否则它并不值得分析。