【问题标题】:How to provide value and get a Key back如何提供价值并取回钥匙
【发布时间】:2012-10-11 08:22:15
【问题描述】:

所以我做了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]

【问题讨论】:

    标签: erlang


    【解决方案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)
    ).
    

    【讨论】:

    • 好的,我现在明白了。我不知道我可以在列表中有一个元组时使用列表:过滤器。非常感谢您快速明确的回答!
    【解决方案2】:

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

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

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

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

    然后使用proplists:lookup_all/2

    正确的编码方式取决于您访问数据的方式(您将执行最多的“查询”类型);但除非您处理大量数据(在这种情况下,您可能需要使用其他一些 datastructure),否则不值得分析。

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多