-1

明確にするために第2バージョンを編集します。

私は次のハッシュを持っています:

サンプル入力->

hashweek={[43,2011]=>[0,0,0],[44,2011]=>[0,0,0],**[45,2011]=>[0,0,0]**,[1,2012]=>[0,0,0],[2,2012]=>[0,0,0]}
timesRealCum={[43,2011]=>1000,[44,2011]=>1100,[1,2012]=>1200,[2,2012]=>1300}

期待される出力->

hashweek={[43,2011]=>[1000,0,0],[44,2011]=>[1100,0,0],**[45,2011]=>[1100,0,0]**,[1,2012]=>[1200,0,0],[2,2012]=>[1300,0,0]}

ふりをするのは、timesRealCumやhashweek、または適切な方法で反復するときに、hashweek [0]値を更新して、timesRealCumからの対応する値、またはtimesRealCumハッシュに存在しない場合は最後の重要な値を含める必要があるということです。

4

2 に答える 2

1

わかりました、これで十分です:

timesRealCum.each{|k, v| hashweek[k][0] = v}

nil値のテストはないため、hashweekでキーが欠落していると予想される場合は、hashweek[k]存在をテストする必要がありhashweek[k][0] ます。

timesRealCum.each{|k, v| hashweek[k][0] = v if hashweek[k] && hashweek[k][0]}

編集:それで、私が正しく理解していれば、timesRealCumにエントリがない場合、hashweekでループしている間に割り当てられた最後の値を取得しますか?

last_v = 0
hashweek.each{|k, v| last_v = v[0] = timesRealCum[k] || last_v }
于 2012-11-15T15:01:01.467 に答える
0

以下のこれは、timesRealCumに週と年が含まれていない場合に、injectを使用して累積値を保持します。これで、[45、2011]に対して[1100、0、0]が返されます。

hashweek.inject(0) do |mem, kv_pair|
  hashweek[kv_pair.first] = [timesRealCum[kv_pair.first]||mem, kv_pair.last[1..-1]].flatten
  mem = hashweek[kv_pair.first][0]
end

p hashweek
#=> {[43, 2011]=>[1000, 0, 0], [44, 2011]=>[1100, 0, 0], [45, 2011]=>[1100, 0, 0], [1, 2012]=>[1200, 0, 0], [2, 2012]=>[1300, 0, 0]}
于 2012-11-15T14:50:53.613 に答える