查看源代码 orddict (stdlib v6.2)

键值字典,表示为有序列表。

此模块提供一个 Key-Value 字典。一个 orddict 是字典的一种表示形式,其中使用键值对的列表来存储键和值。该列表按照 Erlang 项顺序 中键的顺序进行排序。

此模块提供与 dict 模块相同的接口,但具有定义的表示形式。一个区别是,当 dict 认为两个键不匹配(=:=)时是不同的,而此模块仅当两个键不相等(==)时才认为它们是不同的。

说明

包含函数 append/3append_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

另请参阅

dict, gb_trees

摘要

类型

new/0 返回的字典。

函数

将新的 Value 附加到与 Key 关联的当前值列表。如果与 Key 关联的初始值不是值列表,则会生成异常。

将值列表 ValList 附加到与 Key 关联的当前值列表。如果与 Key 关联的初始值不是值列表,则会生成异常。

从字典中删除所有具有指定键的项目。

返回字典 Orddict 中与 Key 关联的值。此函数假设 Key 存在于字典中。如果 Key 不在字典中,则会生成异常。

返回字典中所有键的列表。

Orddict2Orddict1 中所有键和值的字典,其中 Pred(Key, Value)true

在字典中搜索键。返回 {ok, Value},其中 Value 是与 Key 关联的值,如果该键不在字典中,则返回 error

Orddict 的连续键和值上调用 Fun,并附加一个额外的参数 Acc(累加器的缩写)。Fun 必须返回一个新的累加器,该累加器将传递给下一次调用。如果列表为空,则返回 Acc0

Key-Value 列表 List 转换为字典。

如果 Orddict 没有元素,则返回 true,否则返回 false

测试 Key 是否包含在字典 Orddict 中。

Orddict1 的连续键和值上调用 Fun,为每个键返回一个新值。

合并两个字典 Orddict1Orddict2,以创建一个新字典。两个字典中的所有 Key-Value 对都包含在新字典中。

创建一个新字典。

返回 Orddict 中的元素数量。

在字典中存储一个 Key-Value 对。如果 Key 已经存在于 Orddict1 中,则关联的值将替换为 Value

此函数从字典中返回值,并返回不包含此值的新字典。如果该键不在字典中,则返回 error

将字典转换为列表表示形式。

通过对该值调用 Fun 来更新字典中的值,以获取新值。如果 Key 不在字典中,则会生成异常。

通过对该值调用 Fun 来更新字典中的值,以获取新值。如果 Key 不在字典中,则存储 Initial 作为第一个值。

Increment 添加到与 Key 关联的值并存储此值。如果 Key 不在字典中,则存储 Increment 作为第一个值。

类型

-type orddict() :: orddict(_, _).
-type orddict(Key, Value) :: [{Key, Value}].

new/0 返回的字典。

函数

链接到此函数

append(Key, Value, Orddict1)

查看源代码
-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]
链接到此函数

append_list(Key, ValList, Orddict1)

查看源代码
-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,[])
-spec fetch_keys(Orddict) -> Keys when Orddict :: orddict(Key, Value :: term()), Keys :: [Key].

返回字典中所有键的列表。

示例

1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
[{a,1},{b,2}]
2> orddict:fetch_keys(OrdDict1).
[a,b]
链接到此函数

filter(Pred, Orddict1)

查看源代码
-spec filter(Pred, Orddict1) -> Orddict2
                when
                    Pred :: fun((Key, Value) -> boolean()),
                    Orddict1 :: orddict(Key, Value),
                    Orddict2 :: orddict(Key, Value).

Orddict2Orddict1 中所有键和值的字典,其中 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
链接到此函数

fold(Fun, Acc0, Orddict)

查看源代码
-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 转换为字典。

链接到此函数

is_empty(Orddict)

查看源代码 (自 OTP 17.0 起)
-spec is_empty(Orddict) -> boolean() when Orddict :: orddict().

如果 Orddict 没有元素,则返回 true,否则返回 false

-spec is_key(Key, Orddict) -> boolean() when Orddict :: orddict(Key, Value :: term()).

测试 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}]
链接到此函数

merge(Fun, Orddict1, Orddict2)

查看源代码
-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).

合并两个字典 Orddict1Orddict2,以创建一个新字典。两个字典中的所有 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 new() -> orddict(none(), none()).

创建一个新字典。

-spec size(Orddict) -> non_neg_integer() when Orddict :: orddict().

返回 Orddict 中的元素数量。

链接到此函数

store(Key, Value, Orddict1)

查看源代码
-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}]
链接到此函数

take(Key, Orddict)

查看源代码 (自 OTP 20.0 起)
-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}].

将字典转换为列表表示形式。

链接到此函数

update(Key, Fun, Orddict1)

查看源代码
-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}]
链接到此函数

update(Key, Fun, Initial, Orddict1)

查看源代码
-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}]
链接到此函数

update_counter(Key, Increment, Orddict1)

查看源代码
-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).