0

多くのレコードを含むJSONがあります。この質問では、100と仮定します。ChangeとSignの2つのキーがあります。変化は0.14のようなもので、記号は2つの記号「+」または「-」のいずれかです。

それぞれのレコードに、「合計20レコード」と「合計20レコード」の2つのキーを追加したいと思います。これらは、符号がそれぞれ「+」と「-」であった最後の20レコードの合計に等しい場合。

したがって、「合計20レコード」の場合、次のようになります。

array.collect {|array| array['change']}
array.collect {|array| array['sign']} 
if sign = "+" then
#store change in uparray
#when uparray has 20 records add it up and create variable 20recorduptotal

どんな助けでも大歓迎です。どうもありがとう

.each_cons(20)を使用する必要があると思いますが、該当する記号が付いたレコードのみを使用します。

4

1 に答える 1

0

更新:これが実際に機能する可能性のあるものです:)

最後に追加された20個のアイテムの合計を計算する「合計キュー」を定義しました。アイテムが20未満の場合にsum返されます。nil

class SummingQueue
  def initialize(length = 20)
    @values = []
    @sum = 0
    @length = length
  end

  def <<(value)
    @values << value
    @sum += value
    @sum -= @values.shift if @values.length > @length
  end

  def sum
    return nil if @values.length < @length
    @sum
  end
end

queues = Hash.new {|hash, key| hash[key] = SummingQueue.new }

array.each do |item|
  queues[item["sign"]] << item["change"]
  item["last_20_ups"] = queues["+"].sum
  item["last_20_downs"] = queues["-"].sum
end

には現在の値が含まれることに注意してください(該当する場合)。現在の値を含まないlast_20_ups最後の20の値にしたい場合は、行をブロックの最後に移動します。queues[...] << item[...]each

于 2012-11-19T19:51:38.210 に答える