From: Ross Bamford Date: 2006-12-07T17:50:10+09:00 Subject: Re: [GOLF]: partitioning an array On Thu, 07 Dec 2006 03:46:37 -0000, Max Muermann wrote: > Take an array of objects and partition it into subarrays, based on > some arbitrary property of the objects. I would use this for example > for generating a report of purchase orders and grouped by week, month, > year, approximate value, etc. > > The idea is similar to Array#partition, but where partition only does > a true/false check, the resulting array should be partitioned by the > return value of a block so that: > > a = ['a','bc','def','g','hi','jkl','m'] > group(a) {|i| i.size} #=> [["a", "g", "m"], ["bc", "hi"], ["def", "jkl"]] > > > My best effort so far is this: > > def group array, &block > h = {} > array.each do |e| > (h[yield(e)]||=[])< end > h.to_a.map {|e| e[1] } > end > > For some reason, I cannot bring myself to like this. I have the > nagging feeling that there is a more elegant way... > Maybe: a = ['a','bc','def','g','hi','jkl','m'] # => ["a", "bc", "def", "g", "hi", "jkl", "m"] a.inject([]){|dst,e|(dst[e.length-1]||=[])< [["a", "g", "m"], ["bc", "hi"], ["def", "jkl"]] -- Ross Bamford - rosco@roscopeco.remove.co.uk