質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

2638閲覧

rubyです。ハッシュの配列に、とある処理を加えたいのですが、うまくいきません。

newton020801

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2016/10/20 12:23

###前提・実現したいこと
使用している言語は rubyです。
以下のようなハッシュの配列があります。
それぞれのハッシュのkeyには重複があるものがあります。
0. [{"13525002"=>2},
0. {"10408001"=>1},
0. {"10408002"=>1},
0. {"10408003"=>1},
0. {"12402011"=>1},
0. {"12402013"=>1},
0. {"10201010"=>4},
0. {"10706010"=>1},
0. {"10706010"=>1},
0. {"10501011"=>1},
0. {"10501003"=>1},
0. {"11702011"=>1},
0. {"10201010"=>1},
0. {"15601002"=>1}]

重複の無いkeyはそのままでよいのですが、
重複しているkeyのものは、それぞれのvalueを足した値が出したいです。
つまり、
8行目の {"10706010"=>1} の key "10706010" は
9行目の hashにも keyとして存在するので
これら2つのvalue同士を足して
{"10706010"=>2}
感じのhashがほしいのです。
最終的には配列として

[{"13525002"=>2},
{"10408001"=>1},
{"10408002"=>1},
{"10408003"=>1},
{"12402011"=>1},
{"12402013"=>1},
{"10201010"=>5},
{"10706010"=>2},
{"10501011"=>1},
{"10501003"=>1},
{"11702011"=>1},
{"15601002"=>1}]

が得たいのですが、中々思うように取得できません。
どなたか解決方法をご教授いただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

分かりやすくするために少し冗長に書きました。

ruby

1array = 2 [{"13525002"=>2}, 3 {"10408001"=>1}, 4 {"10408002"=>1}, 5 {"10408003"=>1}, 6 {"12402011"=>1}, 7 {"12402013"=>1}, 8 {"10201010"=>4}, 9 {"10706010"=>1}, 10 {"10706010"=>1}, 11 {"10501011"=>1}, 12 {"10501003"=>1}, 13 {"11702011"=>1}, 14 {"10201010"=>1}, 15 {"15601002"=>1}] 16 17hash = {} 18 19# 同じキーの場合は足して、新たに作ったhashを更新していく 20array.each do |h| 21 hash.update(h){|k, o, n| o + n} 22end 23 24hash 25#=> {"13525002"=>2, 26# "10408001"=>1, 27# "10408002"=>1, 28# "10408003"=>1, 29# "12402011"=>1, 30# "12402013"=>1, 31# "10201010"=>5, 32# "10706010"=>2, 33# "10501011"=>1, 34# "10501003"=>1, 35# "11702011"=>1, 36# "15601002"=>1} 37 38# ハッシュから配列にする 39hash.map{|k, v| { k => v } } 40#=> [{"13525002"=>2}, 41# {"10408001"=>1}, 42# {"10408002"=>1}, 43# {"10408003"=>1}, 44# {"12402011"=>1}, 45# {"12402013"=>1}, 46# {"10201010"=>5}, 47# {"10706010"=>2}, 48# {"10501011"=>1}, 49# {"10501003"=>1}, 50# {"11702011"=>1}, 51# {"15601002"=>1}] 52 53 54

投稿2016/10/20 12:39

cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これでも結果は同じですが、まぁ慣れないとわかりにくいですよね。。。。

ruby

1result = array.group_by do |item| 2 item.keys.first 3end.map do |key, items| 4 { key => items.inject(0){ |total, item| total + item.values.first} } 5end

ああ

ruby

1result = array.inject(Hash.new(0)) do |hash,item| 2 hash.update(item){ |_, s, o| s + o } 3end.map{ |k,v| {k =>v} }

これで十分か。

足し算してkeyの重複は排除されているので最後の map{ |k,v| {k =>v} } は、ナシにして

{"13525002"=>2, "10408001"=>1, "10408002"=>1, "10408003"=>1, "12402011"=>1, "12402013"=>1, "10201010"=>5, "10706010"=>2, "10501011"=>1, "10501003"=>1, "11702011"=>1, "15601002"=>1}

という結果を得た方が扱いやすくないですかね?

投稿2016/10/20 13:45

編集2016/10/20 13:57
hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問