2012-10-10 77 views
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)我GE T:[ ]

我想獲得一種方法來輸入值,並取回鑰匙這樣:[fredrik,fred]

回答

1

關於到文檔proplists:lookup_all工作其他方式:

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

所以,您可以通過按鍵只查找:

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

您可以使用lists:filterlists:map inste廣告:

([email protected])7> lists:filter(fun ({K, V}) -> V =:= berlin end, Db).  
[{fredrik,berlin},{fred,berlin}] 
([email protected])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) 
). 
+0

好吧,我現在明白了。我不知道,我可以用列表:過濾器,同時具有在列表中的元組。非常感謝您的快速和明確的答案! – user1213904

0

proplists:lookup_all/2需要作爲第一個參數的關鍵;在你的榜樣,berlin是一種價值,它不是因此返回一個空列表的關鍵。

當然,你可以使用遞歸,找到所有元素(這意味着你將使用它像一個普通的列表,而不是一個proplist變種)。

另一種解決方案是改變編碼方案:

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

然後用proplists:lookup_all/2

正確的方法來編碼這取決於你將訪問數據的方式(什麼樣的「查詢」的你會執行最多);但除非你處理大量的數據(在這種情況下,你可能想要使用一些其他datastructure)它是不是真的值得分析。

相關問題