5

Arrayクラスに次のメソッドがあります。

class Array
  def avg
    if partial_include?(":")
      avg_times
    else
      blank? and 0.0 or (sum.to_f/size).round(2)
    end
  end

  def avg_times
    avg_minutes = self.map do |x|
      hour, minute = x.split(':')
      total_minutes = hour.to_i * 60 + minute.to_i
    end.inject(:+)/size
    "#{avg_minutes/60}:#{avg_minutes%60}"
  end

  def partial_include?(search_term)
    self.each do |e|
      return true if e[search_term]
    end
    return false
  end
end

これは、通常の数値の配列でうまく機能しますが、時間の配列を持つインスタンスが存在する可能性があります。

例えば:[18:35, 19:07, 23:09]

とにかく、時間オブジェクトの配列の平均を計算するには?

4

2 に答える 2

4

したがって、文字列としてフォーマットされた時間の平均を計算できる関数を定義する必要があります。データを分に変換し、合計分を平均してから時間に戻します。

私はそれを次のようにします:

a =  ['18:35', '19:07', '23:09']

def avg_of_times(array_of_time)
  size = array_of_time.size
  avg_minutes = array_of_time.map do |x|
    hour, minute = x.split(':')
    total_minutes = hour.to_i * 60 + minute.to_i
  end.inject(:+)/size
  "#{avg_minutes/60}:#{avg_minutes%60}"
end

p avg_of_times(a) # = > "20:17"

次に、関数を呼び出すときに、配列内のいずれか/すべての項目が時間としてフォーマットされているかどうかを確認します。たぶん正規表現を使用しています。

于 2013-10-09T19:17:44.633 に答える