2

現在、+=1 を使用してそれ自体に値を追加できるハッシュがあります

@hash = Hash.new { |hash, key| hash[key] = Hash.new(0) }
@hash[string1][string2] += 1

これは、次のようなハッシュを返します。

@hash = {string1 => {string2 => 1 }}

そして、その整数値は、同じ文字列値が繰り返されるたびに 1 ずつ増加します。

次に、ハッシュに別の値を追加する必要があるため、次のようになります...

@hash = {string1 => {string2 => {string3 => 1}}}

そして、その数を同じように増やします。

残念ながら、このコード:

@hash = Hash.new { |hash, key| hash[key] = Hash.new(0)}
@hash[string1][string2][string3] += 1

「文字列を整数に変換できません」というエラーを返します。追加された要素があり、Hash.new(0) があるためだと感じているので、文字列がある場所に整数が必要です。あれは正しいですか?

余分な次元を処理し、最後に += 1 を実行して値が増加するように、このハッシュをどのように設定すればよいでしょうか?

ありがとう。

4

3 に答える 3

0

それを過負荷にすることはできないと思います。しかし、別のものを導き出すことができます:

@hash2=Hash.new { |hash,key| hash[key] = @hash }

@hash を 2 次元に、@hash2 を 3 次元に使用できるようにする必要があります。

可変長が必要で、メソッド呼び出しが受け入れられる場合は、次のようなものを使用できます

def deephash (*keys)
  return 0 if keys.length == 0
  key = keys.shift
  { key => deephash(*keys) }
end

n=deephash("a","b","c","d")
=> {"a"=>{"b"=>{"c"=>{"d"=>0}}}}

n["a"]["b"]["c"]["d"] += 1
=> 1

n
=> {"a"=>{"b"=>{"c"=>{"d"=>1}}}}
于 2013-06-21T19:53:44.493 に答える