0

私はそのような配列をルビーに持っています(ドキュメント言語[偶数インデックス]と単語数[奇数インデックス])

words = ["en",200,"ru","120","es",140,"ru",240]

最終結果は次のようになります。

{"en"=>200,"ru=>360","es"=>140}
4

4 に答える 4

6

ああ、重複するキーを合計する必要があります。したがって、このHash::[]方法はここでは機能しません。問題ありません。 each_slice+each_with_objectを使用してから:

words = ["en",200,"ru","120","es",140,"ru",240]

hash = words.each_slice(2).each_with_object({}) do |(k, v), memo|
  memo[k] ||= 0
  memo[k] += v.to_i
end

hash # => {"en"=>200, "ru"=>360, "es"=>140}
于 2013-01-22T08:10:07.620 に答える
1

each_sliceおよびを使用しinjectて、最初に配列をチャンクにスライスしてから、値を追加できます。

これは、Sergio Tulentsevによるバージョンとほぼ同等ですが、少し短いバージョンです(Ruby 1.8で動作します)。

hash = words.each_slice(2).inject(Hash.new(0)) do |hash, (k, v)|
  hash[k] += v.to_i
  hash
end

デフォルト値0でハッシュを初期化することに注意してください。Sergioも同じことを行うことができたので、彼のバージョンは次のようになります。

hash = words.each_slice(2).each_with_object(Hash.new(0)) do |(k, v), memo|
  memo[k] += v.to_i
end

each_with_objectSergioで使用されているものはRuby1.9で導入されたため、古いRubyバージョンでは使用できないことに注意してください。ただし、問題がない可能性があります。

于 2013-01-22T11:58:49.370 に答える
0
words = ['en', 200, 'ru', 120, 'es', 140, 'ru', 240]

words.
 each_slice(2).
 each_with_object(Hash.new(0)) {|(lang, wordcount), acc| acc[lang] += wordcount }
于 2013-01-22T12:15:42.190 に答える
-1
words = ["en",200,"ru","120","es",140,"ru",240]

h1 = Hash[*words.flatten]
于 2013-01-22T08:13:59.090 に答える