On Aug 7, 2009, at 11:05 AM, Nik wrote:
> 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?

No, but lines 7..9 do and line 11 discards the empty array when the  
last element was a cutoff (element[:cue] in this case) and was not  
needed to hold other elements.

-Rob

> 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