2

次のような配列の配列に配置されたいくつかのグラフのデータがあります。

[[date1, value1], [date2, value2], [date3, value3]]
i.e. [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]

私の問題は、グラフ作成ユーティリティが「6-02-13」のデータをグラフ化していないのに、0 をグラフ化したいことです。

すべての有効な日付の別の配列があります。["6-01-13", "6-02-13", "6-03-13", ...]

[date, 0]データ配列にまだ存在しないすべての日付をデータ配列に挿入する最良の方法は何ですか? 配列の順序は気にしません。

私は次の行に沿って何かをするだろうと考えました:

dates_array.each do |date|
  unless data_array.has_date(date)
    data_array.push([date, 0])
  end
end

しかし、すべての日付をループし、その日付がデータ配列で表されていることを確認せずに、この has_date(date) メソッドがどのように機能するかを考えることはできません (単純にループのループになるため、理想的ではありません)。

編集: 既存のデータ (および日付) は、データベースから配列として取得されます。

4

7 に答える 7

5

配列の配列をデフォルト値ゼロのハッシュに変換します。

def data_to_hash(data)
  Hash.new(0).merge(Hash[data])
end

data = [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]

hashed_data = data_to_hash(data)
p hashed_data['6-02-13']
p hashed_data['6-01-13']

出力:

0
5

配列にない日付は 0 を返します。データ構造としてハッシュを使用すると、日付を探して配列を反復処理するよりも、大規模なデータ セットではるかに高速になります。

回答の更新

無効なキーをハッシュに「固定」するには、Hash#new のブロック バリアントを使用できます。

def data_to_hash(data)
  Hash.new { |h,k| h[k] = 0 }.merge(Hash[data])
end

data = [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]
hashed_data = data_to_hash(data)

p hashed_data
%w{6-03-13 7-8-99}.each do |d|
  p hashed_data[d]
end
p hashed_data

出力:

{"6-01-13"=>5, "6-03-13"=>2, "6-04-13"=>11}
2
0
{"6-01-13"=>5, "6-03-13"=>2, "6-04-13"=>11, "7-8-99"=>0}

この例では、7-8-99 は元のデータ セットには存在しませんが、そのキーにアクセスすると 0 に設定されます。

于 2013-06-07T20:34:54.937 に答える
1

日付範囲がわかっている場合は、配列にその範囲のすべての日付を事前に入力し、デフォルト値のゼロを指定するだけです。 array = Array.new(31) {['date', 0]}

日付の代わりに実際の情報を提供してください。

または、次のようにします。(date..date+31).to_a.map!(&:to_s).zip([0]*32)

既存の日付項目を取得する方法を教えていただければ、より適切なものを作成できると思います。

于 2013-06-07T20:38:26.373 に答える
1
dates_array.each do |date|
  data.push [date, 0] unless data.map(&:first).include? date
end 

これは機能します。おそらく誰かがそれを改善することができます。

于 2013-06-07T20:36:29.460 に答える