如何提供价值并获得一把钥匙

时间:2012-10-10 23:57:42

标签: erlang

所以我创建了2个数据库:

  1. 包含[{james,london}]
  2. 的Db1
  3. Db2包含:[{james,london},{fredrik,berlin},{fred,berlin}]
  4. 我有一个匹配函数,如下所示:

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

    当我这样做时:match(berlin, Db2)我得到:[ ]

    我想要的是一种输入值并以这种方式取回密钥的方法:[fredrik,fred]

2 个答案:

答案 0 :(得分: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:filterlists: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)
).

答案 1 :(得分:0)

proplists:lookup_all/2将第一个参数作为键;在您的示例中,berlin是一个值,它不是键,因此返回一个空列表。

当然,您可以使用递归并查找所有元素(意味着您将像普通列表一样使用它而不是支持列表)。

另一种解决方案是更改编码方案:

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

然后使用proplists:lookup_all/2

对其进行编码的正确方法取决于您访问数据的方式(您最常执行的“查询”类型);但除非你操纵大量数据(在这种情况下你可能想要使用其他datastructure),否则不值得分析。