查看源代码 orddict (stdlib v6.2)
键值字典,表示为有序列表。
此模块提供一个 Key
-Value
字典。一个 orddict
是字典的一种表示形式,其中使用键值对的列表来存储键和值。该列表按照 Erlang 项顺序 中键的顺序进行排序。
此模块提供与 dict
模块相同的接口,但具有定义的表示形式。一个区别是,当 dict
认为两个键不匹配(=:=
)时是不同的,而此模块仅当两个键不相等(==
)时才认为它们是不同的。
说明
包含函数 append/3
和 append_list/3
,以便可以将键控值存储在列表累加器中,例如
> D0 = orddict:new(),
D1 = orddict:store(files, [], D0),
D2 = orddict:append(files, f1, D1),
D3 = orddict:append(files, f2, D2),
D4 = orddict:append(files, f3, D3),
orddict:fetch(files, D4).
[f1,f2,f3]
这避免了首先获取键控值,将新值附加到存储值列表,然后存储结果的麻烦。
如果知道键在字典中,则应使用函数 fetch/2
,否则使用函数 find/2
。
另请参阅
摘要
函数
将新的 Value
附加到与 Key
关联的当前值列表。如果与 Key
关联的初始值不是值列表,则会生成异常。
将值列表 ValList
附加到与 Key
关联的当前值列表。如果与 Key
关联的初始值不是值列表,则会生成异常。
从字典中删除所有具有指定键的项目。
返回字典 Orddict
中与 Key
关联的值。此函数假设 Key
存在于字典中。如果 Key
不在字典中,则会生成异常。
返回字典中所有键的列表。
Orddict2
是 Orddict1
中所有键和值的字典,其中 Pred(Key, Value)
为 true
。
在字典中搜索键。返回 {ok, Value}
,其中 Value
是与 Key
关联的值,如果该键不在字典中,则返回 error
。
在 Orddict
的连续键和值上调用 Fun
,并附加一个额外的参数 Acc
(累加器的缩写)。Fun
必须返回一个新的累加器,该累加器将传递给下一次调用。如果列表为空,则返回 Acc0
。
将 Key
-Value
列表 List
转换为字典。
如果 Orddict
没有元素,则返回 true
,否则返回 false
。
测试 Key
是否包含在字典 Orddict
中。
在 Orddict1
的连续键和值上调用 Fun
,为每个键返回一个新值。
合并两个字典 Orddict1
和 Orddict2
,以创建一个新字典。两个字典中的所有 Key
-Value
对都包含在新字典中。
创建一个新字典。
返回 Orddict
中的元素数量。
在字典中存储一个 Key
-Value
对。如果 Key
已经存在于 Orddict1
中,则关联的值将替换为 Value
。
此函数从字典中返回值,并返回不包含此值的新字典。如果该键不在字典中,则返回 error
。
将字典转换为列表表示形式。
通过对该值调用 Fun
来更新字典中的值,以获取新值。如果 Key
不在字典中,则会生成异常。
通过对该值调用 Fun
来更新字典中的值,以获取新值。如果 Key
不在字典中,则存储 Initial
作为第一个值。
将 Increment
添加到与 Key
关联的值并存储此值。如果 Key
不在字典中,则存储 Increment
作为第一个值。
类型
函数
-spec append(Key, Value, Orddict1) -> Orddict2 when Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
将新的 Value
附加到与 Key
关联的当前值列表。如果与 Key
关联的初始值不是值列表,则会生成异常。
另请参阅 说明 部分。
示例 1
1> OrdDict1 = orddict:from_list([{x, []}]).
[{x,[]}]
2> OrdDict2 = orddict:append(x, 1, OrdDict1).
[{x,[1]}]
3> OrdDict3 = orddict:append(x, 2, OrdDict2).
[{x,[1,2]}]
4> orddict:append(y, 3, OrdDict3).
[{x,[1,2]},{y,[3]}]
示例 2
1> OrdDict1 = orddict:from_list([{a, no_list}]).
[{a,no_list}]
2> orddict:append(a, 1, OrdDict1).
** exception error: bad argument
in operator ++/2
called as no_list ++ [1]
-spec append_list(Key, ValList, Orddict1) -> Orddict2 when ValList :: [Value], Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
将值列表 ValList
附加到与 Key
关联的当前值列表。如果与 Key
关联的初始值不是值列表,则会生成异常。
另请参阅 说明 部分。
示例
1> OrdDict1 = orddict:from_list([{x, []}]).
[{x,[]}]
2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
[{x,[1,2]}]
3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
[{x,[1,2]},{y,[3,4]}]
-spec erase(Key, Orddict1) -> Orddict2 when Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
从字典中删除所有具有指定键的项目。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:erase(a, OrdDict1).
[{b,2}]
-spec fetch(Key, Orddict) -> Value when Orddict :: orddict(Key, Value).
返回字典 Orddict
中与 Key
关联的值。此函数假设 Key
存在于字典中。如果 Key
不在字典中,则会生成异常。
另请参阅 说明 部分。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:fetch(a, OrdDict1).
1
3> orddict:fetch(missing, OrdDict1).
** exception error: no function clause matching orddict:fetch(missing,[])
返回字典中所有键的列表。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:fetch_keys(OrdDict1).
[a,b]
-spec filter(Pred, Orddict1) -> Orddict2 when Pred :: fun((Key, Value) -> boolean()), Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
Orddict2
是 Orddict1
中所有键和值的字典,其中 Pred(Key, Value)
为 true
。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
[{b,2}]
-spec find(Key, Orddict) -> {ok, Value} | error when Orddict :: orddict(Key, Value).
在字典中搜索键。返回 {ok, Value}
,其中 Value
是与 Key
关联的值,如果该键不在字典中,则返回 error
。
另请参阅 说明 部分。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:find(a, OrdDict1).
{ok,1}
3> orddict:find(c, OrdDict1).
error
-spec fold(Fun, Acc0, Orddict) -> Acc1 when Fun :: fun((Key, Value, AccIn) -> AccOut), Orddict :: orddict(Key, Value), Acc0 :: Acc, Acc1 :: Acc, AccIn :: Acc, AccOut :: Acc.
在 Orddict
的连续键和值上调用 Fun
,并附加一个额外的参数 Acc
(累加器的缩写)。Fun
必须返回一个新的累加器,该累加器将传递给下一次调用。如果列表为空,则返回 Acc0
。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
[{b,102},{a,101}]
-spec from_list(List) -> Orddict when List :: [{Key, Value}], Orddict :: orddict(Key, Value).
将 Key
-Value
列表 List
转换为字典。
如果 Orddict
没有元素,则返回 true
,否则返回 false
。
测试 Key
是否包含在字典 Orddict
中。
-spec map(Fun, Orddict1) -> Orddict2 when Fun :: fun((Key, Value1) -> Value2), Orddict1 :: orddict(Key, Value1), Orddict2 :: orddict(Key, Value2).
在 Orddict1
的连续键和值上调用 Fun
,为每个键返回一个新值。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
[{a,101},{b,102}]
-spec merge(Fun, Orddict1, Orddict2) -> Orddict3 when Fun :: fun((Key, Value1, Value2) -> Value), Orddict1 :: orddict(Key, Value1), Orddict2 :: orddict(Key, Value2), Orddict3 :: orddict(Key, Value).
合并两个字典 Orddict1
和 Orddict2
,以创建一个新字典。两个字典中的所有 Key
-Value
对都包含在新字典中。
如果一个键出现在两个字典中,则使用该键和两个值调用 Fun
以返回一个新值。
merge/3
可以定义如下,但速度更快
merge(Fun, D1, D2) ->
fold(fun (K, V1, D) ->
update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
end, D2, D1).
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
[{b,7},{c,8}]
3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
[{a,1},{b,14},{c,8}]
创建一个新字典。
-spec size(Orddict) -> non_neg_integer() when Orddict :: orddict().
返回 Orddict
中的元素数量。
-spec store(Key, Value, Orddict1) -> Orddict2 when Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
在字典中存储一个 Key
-Value
对。如果 Key
已经存在于 Orddict1
中,则关联的值将替换为 Value
。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:store(a, 99, OrdDict1).
[{a,99},{b,2}]
3> orddict:store(c, 100, OrdDict1).
[{a,1},{b,2},{c,100}]
-spec take(Key, Orddict) -> {Value, Orddict1} | error when Orddict :: orddict(Key, Value), Orddict1 :: orddict(Key, Value), Key :: term(), Value :: term().
此函数从字典中返回值,并返回不包含此值的新字典。如果该键不在字典中,则返回 error
。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:take(a, OrdDict1).
{1,[{b,2}]}
3> orddict:take(missing, OrdDict1).
error
-spec to_list(Orddict) -> List when Orddict :: orddict(Key, Value), List :: [{Key, Value}].
将字典转换为列表表示形式。
-spec update(Key, Fun, Orddict1) -> Orddict2 when Fun :: fun((Value1 :: Value) -> Value2 :: Value), Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
通过对该值调用 Fun
来更新字典中的值,以获取新值。如果 Key
不在字典中,则会生成异常。
示例
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:update(a, fun (V) -> V + 100 end, OrdDict1).
[{a,101},{b,2}]
-spec update(Key, Fun, Initial, Orddict1) -> Orddict2 when Initial :: Value, Fun :: fun((Value1 :: Value) -> Value2 :: Value), Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value).
通过对该值调用 Fun
来更新字典中的值,以获取新值。如果 Key
不在字典中,则存储 Initial
作为第一个值。
例如,append/3
可以定义如下
append(Key, Val, D) ->
update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
示例 1
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:update(c, fun (V) -> V + 100 end, 99, OrdDict1).
[{a,1},{b,2},{c,99}]
示例 2
1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:update(a, fun (V) -> V + 100 end, 99, OrdDict1).
[{a,101},{b,2}]
-spec update_counter(Key, Increment, Orddict1) -> Orddict2 when Orddict1 :: orddict(Key, Value), Orddict2 :: orddict(Key, Value), Increment :: number().
将 Increment
添加到与 Key
关联的值并存储此值。如果 Key
不在字典中,则存储 Increment
作为第一个值。
可以定义如下,但速度更快
update_counter(Key, Incr, D) ->
update(Key, fun (Old) -> Old + Incr end, Incr, D).