0

私がやりたいのは次のようなものです。

arr = %w(good bad great dull)
"Today was a #{arr.sample} day"

次に、これを100回ループして、サンプリングされた各要素をカウントし、個別のハッシュまたは配列にカウンターを収集したいとします。どうすればよいでしょうか。そして、これはハッシュまたは配列でより適切にアプローチされますか?

何かのようなもの:

counter = []
arr.each { |el| counter << [el => 0] }

100.times do 
  el = arr.sample
  # lost here..
end

必要な出力(配列またはハッシュ):

["good" => 20, "bad" => 20, "great" => 40, "dull" => 20]

また、私の最初の考え方には、よりエレガントな解決策があると思います。

4

2 に答える 2

2

私はあなたがかなり近いと思います。ハッシュは完全に理にかなっています。

counter = Hash.new
arr.each { |el| counter[el] = 0  }

100.times do 
  counter[arr.sample] += 1
end
于 2012-06-17T03:44:56.657 に答える
2

おそらくこれはあなたが望むものですか?

arr = %w(good bad great dull)
counter = Hash.new(0)
100.times { counter[arr.sample] += 1 }
counter #=> {"great"=>22, "good"=>29, "bad"=>21, "dull"=>28}

次のこともできます。

arr = %w(good bad great dull)
(1..100).each_with_object(Hash.new(0)) { |_, h| h[arr.sample] += 1 }
#=> {"great"=>22, "good"=>29, "bad"=>21, "dull"=>28}

これはもう少し「自己完結型」であり、100likeの代わりにハッシュ自体を返しますtimes(ただし、tapその効果を得るために使用することもできます)。

于 2012-06-17T03:45:53.637 に答える