inとoutのログを出力するプログラミングのアルゴリズムについて、
ご意見いただければと思います。
Ruby on Rails4での実装を考えています。
(irbで確認できるよう、rubyで動くように書き直しています)
lang
1in_datas = [] 2in_datas << {item_id: 1, num: 3} 3in_datas << {item_id: 2, num: 6} 4in_datas << {item_id: 3, num: 1} 5out_datas = [] 6out_datas << {item_id: 4, num: -4} 7out_datas << {item_id: 5, num: -6}
このようなデータがあるとして、
lang
1in_logs 2item_id 1 from_item_id 4 diff_num 3 3item_id 2 from_item_id 4 diff_num 1 4item_id 2 from_item_id 5 diff_num 5 5item_id 3 from_item_id 5 diff_num 1 6 7out_logs 8item_id 4 to_item_id 1 diff_num -3 9item_id 4 to_item_id 2 diff_num -1 10item_id 5 to_item_id 2 diff_num -5 11item_id 5 to_item_id 3 diff_num -1
上記のようなログを生成したいと思います。
以下のアルゴリズムを考えましたが、もっと頭のいい方法はありますでしょうか。
リファクタリング、全く違う観点でのご指摘をお願いいたします。
lang
1index = 0 2in_datas.each do |in_data| 3 num = in_data[:num] 4 while num > 0 5 if num < -out_datas[index][:num] 6 diff_num = num 7 else 8 diff_num = -out_datas[index][:num] 9 end 10 puts "InLog: item_id:#{in_data[:item_id]} from_item_id:#{out_datas[index][:item_id]} diff_num:#{diff_num}" 11 puts "OutLog: item_id:#{out_datas[index][:item_id]} to_item_id:#{in_data[:item_id]} diff_num:#{-diff_num}" 12 #InLog.create(item_id: in_data[:item_id], from_item_id: out_datas[index][:item_id], diff_num: diff_num) 13 #OutLog.create(item_id: out_datas[index][:item_id], to_item_id: in_data[:item_id], diff_num: -diff_num) 14 num = num - diff_num 15 out_datas[index][:num] = out_datas[index][:num] + diff_num 16 if out_datas[index][:num] >= 0 17 index = index + 1 18 end 19 end 20end
ログを出している状況がいまひとつ掴めません。
in_datas = [{item_id: 1, num: 3}, {item_id: 2, num: 6}, {item_id: 3, num: 1}]
out_datas = [{item_id: 4, num: -4}, {item_id: 5, num: -6}]
という状況から始まっていて、その状況でのログ出力が in_datas と out_datas との組み合わせ(差分)と理解したのですが、正しいでしょうか?
(Array#<< が使われていたので、配列が変化していくのに応じてログ出力を行っているのかと思ってしまったのですが、そういうことではないですよね?)
ちなみに data は複数形もしくは不可算名詞なので "datas" という表記は存在しません(単数形は datum ですが使うことはほぼ無い)。
コメント有難うございます。 datas が単語として間違っている旨、英語力が弱く…大変助かりました。注意します。
こちらですが、配列は変化しないです。 data[0] = Hash data[1] = Hash ... こちらでデータを作るべきでした。混乱を招く書き方ですみません。ご指摘の通り、差分で問題ございません。
回答1件
あなたの回答
tips
プレビュー