Thanks Rob, in line 6 (where #!/usr/bin/ruby -w is line 1) where
results[-1]<<element, is there a check to verify that the element's
cue is true and henceforth start a new and empty array?

On Aug 6, 6:32 pm, Rob Biedenharn <[email protected]> wrote:
> On Aug 6, 2009, at 3:22 PM, Nik wrote:
>
>
>
>
>
> > Hello, I have this big array of hashes:
> > A =[ h0, h1, h2, ..., hn]
> > some hi's' :cue key is true, others' is false.
> > e.g.,
> > h1[:cue] = false
> > h2[:cue] = false
> > h3[:cue] = true
> > h4[:cue] = false
> > h5[:cue] = true
> > ...
> > hn[:cue] = ...
>
> > Again, these hashes are in an array, A.
>
> > Now, I'd like to group them into smaller arrays whose last item has a
> > true cue
> > so
> > A' = [   [h1, h2, h3], [h4, h5], ... , [...]   ]
>
> > Is there a built-in method to cook this up?
> > If not, what combination of methods might you think would work most
> > efficiently?
>
> > Thank You
>
> Well, this seems to be a tasty dish. I took some liberty with your  
> minimal spec, but you should see the first test for the usage that  
> maps to your example.
>
> #!/usr/bin/ruby -w
> class Array
>    def split_when
>      result = [[]]
>      each do |element|
>        result[-1] << element
>        if block_given? ? yield(element) : element
>          result << []
>        end
>      end
>      result.pop if result.last.empty?
>      result
>    end
> end
>
> if File.expand_path($0) == File.expand_path(__FILE__)
> require 'test/unit'
> class SplitWhenTest < Test::Unit::TestCase
>    def setup
>      h1 = { :cue => false }
>      h2 = { :cue => false }
>      h3 = { :cue => true  }
>      h4 = { :cue => false }
>      h5 = { :cue => true  }
>     �...@ary = [ h1, h2, h3, h4, h5 ]
>     �...@expected = [ [h1, h2, h3], [h4, h5] ]
>    end
>
>    def test_example_from_email
>      assert_equal @expected, @ary.split_when {|e| e[:cue]}
>    end
>
>    def test_simple
>      original = [ false, true,  false, false, true,  true,  false,  
> true,  false, true,  false ]
>      expected = [[false, true],[false, false, true],[true],[false,  
> true],[false, true],[false]]
>      assert_equal expected, original.split_when, "no block"
>      assert_equal expected, original.split_when {|e|e}, "simple block"
>    end
> end
> end
> __END__
>
> :code/ruby $ ./array_split_when.rb
> Loaded suite ./array_split_when
> Started
> ..
> Finished in 0.000585 seconds.
>
> 2 tests, 3 assertions, 0 failures, 0 errors
>
> -Rob
>
> Rob Biedenharn          http://agileconsultingllc.com
> [email protected]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to