0

dict で map を呼び出して、それらの値のリストを取得したいと思います。Erlang の dict モジュールにはそれが組み込まれていないため、これを回避する方法を次に示します。

Fn = fun(Tuple) ->
  [Key, Value] = Tuple,
  string:join([Key, Value], "=")
end,
lists:map(Fn, dict:to_list(Dict)).

問題は、キーと値が複数回割り当てられることです。dict:to_listへの匿名関数の呼び出し内で返されるキー/値のタプルを「分割」するにはどうすればよいstring:joinですか?

4

3 に答える 3

3

値としてリストを持つタプルのリストがあるので、おそらく次のように見えます:

[文字列:join ([K, V], "=") || {K, 値} <- dict:to_list(Your_dictionary), V <- 値].

お役に立てれば

于 2012-09-22T20:19:09.310 に答える
2

ここであなたが求めていることに従っているかどうかわかりません。「キーと値が複数回割り当てられる」とはどういう意味ですか?

dict をマップして値のリストを取得したいと言うとき、「キーと値」の意味での値を意味しますか? その場合、これを行うことができます:

Values = [V || {_,V} <- dict:to_list(Dict)].

これは、辞書のキー値の性質の「値」側のリストを提供するだけです。

同様のことを行うことで、キーのリストを取得することもできます。

Keys = [K || {K,_} <- dict:to_list(Dict)].

キーと値の両方のリストを分離したい場合は、lists:unzip/1 を使用できます。

{Keys, Values} = lists:unzip(dict:to_list(Dict)).

次にKeys、すべてのキーValuesのリストになり、すべての値のリストになります。

Keyそれとも、dict の各メンバーに対してとValueの両方が (変数の割り当てのように) 割り当てられているという事実に関心がありますか? もしそうなら、しないでください。これらの代入は高速であり、単なるポインタであり、メモリ コピーではありません。

于 2012-09-23T00:32:40.163 に答える
1

これまでdictモジュールに取り組んだことのない比較的初心者ですが、これは私にとってはうまくいくようです:

dict:fold(fun(Key, Value, Accum) ->
                  [Value | Accum] end, [], D).

例:

init() ->
    Dict = dict:new(),
    Dict2 = dict:append(key, value, Dict),
    Dict3 = dict:append(key2, value2, Dict2),
    dict:append(key3, value3, Dict3).

grab_values(D) ->
    dict:fold(fun(Key, Value, Accum) ->
                      [Value | Accum] end, [], D).

呼び出し:

4> D = dictfold:init().
{dict,3,16,16,8,80,48,
      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
      {{[],[],
        [[key2,value2]],
        [[key3,value3]],
        [],[],[],[],[],
        [[key,value]],
        [],[],[],[],[],[]}}}
5> dictfold:grab_values(D).
[[value2],[value3],[value]]
于 2012-09-22T20:09:14.657 に答える