Two-way Hash Table in Erlang
我正试图想出一个类似字典的数据结构,我可以在二郎使用。目标是确保所有的价值观以及关键点都是独一无二的。每次修改之后,我都可以通过显式的一致性检查来完成这项工作,但我希望有一个模糊的类型可以为我完成这项工作。有吗?如果没有,是否有比将检查包装到修改数据的每个函数中(或返回稍微不同的副本)更好的方法?
我希望至少有120个元素,不超过几千个,以防这很重要。
像这样的情况怎么样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | -module(unidict). -export([ new/0, find/2, store/3 ]). new() -> dict:new(). find(Key, Dict) -> dict:find({key, Key}, Dict). store(K, V, Dict) -> Key = {key, K}, case dict:is_key(Key, Dict) of true -> erlang:error(badarg); false -> Value = {value, V}, case dict:is_key(Value, Dict) of true -> erlang:error(badarg); false -> dict:store(Value, K, dict:store(Key, V, Dict)) end end. |
Shell会话示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 1> c(unidict). {ok,unidict} 2> D = unidict:new(). {dict,0,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, {{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}} 3> D1 = unidict:store(key, value, D). {dict,2,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, {{[],[],[],[],[],[],[],[],[],[],[],[],[],[], [[{key,key}|value],[{value,...}|{...}]], []}}} 4> D2 = unidict:store(key, value, D1). ** exception error: bad argument in function unidict:store/3 5> D2 = unidict:store(key2, value, D1). ** exception error: bad argument in function unidict:store/3 6> D2 = unidict:store(key, value2, D1). ** exception error: bad argument in function unidict:store/3 7> D2 = unidict:store(key2, value2, D1). {dict,4,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, {{[], [[{key,key2}|value2]], [],[],[],[],[],[],[],[],[],[],[], [[{value,value2}|{key,key2}]], [[{key,key}|value],[{value,...}|{...}]], []}}} 8> unidict:find(key, D2). {ok,value} 9> unidict:find(key2, D2). {ok,value2} |
号
您可以对几百个元素使用简单的键、值列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Is there one?
号
我相信不是在标准图书馆。我将使用由