Ruby 两数组分组求和

Posted by wxianfeng Sat, 24 Jul 2010 11:56:00 GMT

环境 : ruby 1.8.7

今天我有一个这样的需求,例如,a=[1,2,1] , b= [10,20,30] 数组b中的项是a项对应的值 , 现在要求出a数组中相同项的的和(值对应b的数组) , 例如数组a,b的最后结果是 {1=>40,2=>20}

在ruby的Arrray的方法中 没有找到对应的方法, 就自己写了个,用 ruby已有的方法堆砌起来的, 自认为比较繁琐,望高人指点

# DEMO : [1,2,3].sum => 6
#        [1,2,3].sum { |s| s*2  } => 12
class Array
  #  def sum
  #    inject { |sum,n| sum + n }    #    self.reduce(&:+)
  #  end

  # Rails 里Array的sum方法源码
  def sum(identity = 0, &block)
    if block_given?
      map(&block).sum(identity)
    else
      inject { |sum, element| sum + element } || identity
    end
  end
end

class Hash
  # demo :
  # a = [1,2,1,3]
  # b = [10,20,30,50]
  # Hash.group_sum(a,b) =>  {1=>40,2=>20,3=>50}
  def self.group_sum(arr1,arr2)
    hsh = {}
    hsh2 = {}
    arr1.uniq.each do |ele| 
      arr = []
      arr1.each_with_index do |val,index|
        arr << index if val == ele
      end
      hsh[ele] = arr
    end
    values = []
    hsh.each do |k,v|      
      sum = v.inject(0) { |s,x| s+arr2[x] }
      values << sum
    end
    hsh2 = Hash[arr1.uniq.zip(values)]
    hsh2
  end
end