From: Robert Klemme Date: 2010-01-06T23:15:09+09:00 Subject: Re: group in the array On 01/06/2010 09:45 AM, Kolya17 Kolya17 wrote: > Hi! > > I have a two-dimensional array Farr. > > Farr.each{ |i| print i} > > output: > ["200912-829", 9] > ["200912-893", 3] > ["200912-893", 5] > ["200912-829", 1] > ["200911-818", 6] > ["200911-893", 1] > ["200911-827", 2] > > I'm trying to get another two-dimensional array, which would be the > grouping of the first elements. > In SQL it would be so: > > select String, sum(Number) > from Farr > group by String > > and the resulting array would: > ["200912-829", 10] > ["200912-893", 8] > ["200911-818", 6] > ["200911-893", 1] > ["200911-827", 2] > > Help please. > I apologize for spelling, English is not my native. There is actually Array#group_by since 1.8.7: arr.group_by {|date,val| date}.each do |date, items| printf "%-20s %6d\n", date, items.inject(0) {|sum,x|sum+x}, "\n" end or arr.inject Hash.new(0) do |gr,(date,val)| gr[date] += val gr end.each do |date, sum| printf "%-20s %6d\n", date, sum end or more down to earth grouped = Hash.new(0) arr.each do |date, val| grouped[date] += val end grouped.each do |date, sum| printf "%-20s %6d\n", date, sum end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/