1

私は構造体を研究しています。各構造体には、製品 ID と数量の 2 つの値しかありません。例えば:

prodcode = 2473 , quantity = 1
prodcode = 2473 , quantity = 4
prodcode = 3328 , quantity = 6
prodcode = 2958 , quantity = 3
prodcode = 2473 , quantity = 7
prodcode = 2958 , quantity = 2
prodcode = 2473 , quantity = -1

次のような構造体全体の数量の合計を取得したい:

prodcode = 2473 , quantity = 11
prodcode = 3328 , quantity = 6
prodcode = 2958 , quantity = 5

数量の降順でソートするとプラスになります。問題の構造体配列を作成するために使用するコードは次のとおりです。

class Figs < Struct.new(:prodcode, :quantity)  
  def print_csv_record  
    prodcode.length==0 ? printf(",") : printf(prodcode)  
    quantity.length==0 ? printf(",") : printf(",", quantity.to_i)  
    printf("\n")  
  end  
end  

...  

for x in 0...global.length  
  p = Figs.new  
  p.prodcode = global[x][0]  
  p.quantity = global[x][1].to_i  
  figures.push(p)  
end

構造体配列は「​​数字」ですが、取得します

undefined local variable or method 'quantity' for main:Object (NameError)
4

3 に答える 3

0

ハッシュを使用して、新しい構造体内の数量を集計できます。

MyStruct = Struct.new(:prodcode, :quantity)

struct_array.inject({}) do |m, s| 
  m[s.prodcode] ||= MyStruct.new(s.prodcode, 0)
  m[s.prodcode].quantity += quantity
  m
end.values
于 2013-04-03T21:09:54.050 に答える
0

Enumerable#group_byこれをEnumerable#reduce非常に簡単に行うことができます:

編集:OPのクラス名を使用し、数量の降順でソートを追加し、よりきれいなprint_csvメソッドを追加します

require 'csv'

class Figs < Struct.new(:prodcode, :quantity)
  def print_csv_record
    print to_a.to_csv
  end
end

a = [Figs[2473,1], Figs[2473,4], Figs[3328,6], Figs[2958,3],
     Figs[2473,7], Figs[2958,2], Figs[2473,-1]]

a.group_by(&:prodcode).
  map { |k,v| Figs[ k, v.map(&:quantity).reduce(:+) ] }.
  sort_by { |e| -e.quantity }

=> [#<struct Figs prodcode=2473, quantity=11>,
    #<struct Figs prodcode=3328, quantity=6>,
    #<struct Figs prodcode=2958, quantity=5>]
于 2013-04-03T22:40:04.940 に答える