环境 : 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
