> Here's a little group method I just wrote on the Array class (and how to
use it) that might serve your purpose well:
>
> class Array
>     def group
>     groups = {}
>     self.each do |e|
>       key = yield e
>       groups[key] ||= []
>       groups[key] << e
>     end
>     groups
>     end
> end
>
> class Foo
>   attr_accessor :year, :title
>
>   def initialize(year, title)
>     self.year = year
>     self.title = title
>   end
> end
>
> a = []
> a << Foo.new(2006, 'Alpha')
> a << Foo.new(2006, 'Beta')
> a << Foo.new(2007, 'Gamma')
> a << Foo.new(2008, 'Delta')
>
> ag = a.group { |e| e.year }
>
> ag.keys.sort.each do |year|
>   puts year
>   ag[year].each do |foo|
>     puts '  ' + foo.title
>   end
> end
>
> __END__
>
> 2006
>   Alpha
>   Beta
> 2007
>   Gamma
> 2008
>   Delta

I've been playing with inject lately. FWIW, you can use it here, although
it's not as pretty or obvious as: a.group { |e| e.year }

ag = a.inject({}) { |h, e| h[e.year] = (h[e.year] || []) << e; h }

or

ag = a.inject({}) { |h, e| h[e.year] ||= []; h[e.year] << e; h }


Brian

_______________________________________________
Sdruby mailing list
[email protected]
http://lists.sdruby.com/mailman/listinfo/sdruby

Reply via email to