# Testing for subarrays

**URL:** <https://www.ruby-forum.com/t/testing-for-subarrays/196306>\
**Category:** Ruby\
**Created:** [October 11, 2010, 11:27am UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306 "2010-10-11T11:27:37Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 11:27am UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/1 "2010-10-11T11:27:37Z")

</div>

I want to check whether a given array contains a given subarray and  
return the corresponding range.  
Is there a builtin method ? If not, do you have better than this :

class Array  
def look\_up(sub\_array)  
len = sub\_array.size  
self.each\_cons(len).with\_index do |cons, index|  
return Range.new(index, index + len - 1) if cons == sub\_array  
end  
nil  
end  
end

\_md

---

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 11:49am UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/2 "2010-10-11T11:49:19Z")

</div>

On Mon, Oct 11, 2010 at 11:27 AM, Michel D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> nil  
> end  
> end

Not necessarily better:

irb(main):001:0\> a = [1,2,3,4,5,6,7,8]  
=\> [1, 2, 3, 4, 5, 6, 7, 8]  
irb(main):002:0\> b = [4,5,6]  
=\> [4, 5, 6]  
irb(main):004:0\> a.each\_cons(b.size).to\_a.index(b)  
=\> 3  
irb(main):005:0\> a.each\_cons(b.size).to\_a.index([5,1,2])  
=\> nil

Jesus.

---

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 12:05pm UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/3 "2010-10-11T12:05:10Z")

</div>

JesÃºs Gabriel y GalÃ¡n wrote:

> a.each\_cons(b.size).to\_a.index(b)

Yes !  
\_md

---

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 12:15pm UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/4 "2010-10-11T12:15:40Z")

</div>

Hi –

On Mon, 11 Oct 2010, JesÃºs Gabriel y GalÃ¡n wrote:

> > Â Â end  
> > irb(main):004:0\> a.each\_cons(b.size).to\_a.index(b)  
> > =\> 3  
> > irb(main):005:0\> a.each\_cons(b.size).to\_a.index([5,1,2])  
> > =\> nil

Here’s another way that is more verbose but that doesn’t create the  
whole array (which probably doesn’t matter anyway, unless it’s a huge  
array and you’re cycle-shaving). I also prefer extending individual  
objects, rather than adding to Array.

module SubArrayFinder  
def look\_up(sub\_array)  
sub\_size = sub\_array.size  
index = find\_index.with\_index do |e,i|  
self[i, sub\_size] == sub\_array  
end  
return(index…index+sub\_size-1) if index  
end  
end

David

–  
David A. Black, Senior Developer, Cyrus Innovation Inc.

The Ruby training with Black/Brown/McAnally  
Compleat Philadelphia, PA, October 1-2, 2010  
Rubyist [http://www.compleatrubyist.com](http://www.compleatrubyist.com)

---

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 1:43pm UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/5 "2010-10-11T13:43:06Z")

</div>

Michel D. wrote:

> Comparing with my original proposal, a side question is whether using  
> each\_cons is faster, or not, that iterating with self[i, sub\_size]…
> 
> \_md

sub(“that”, “than”), sorry  
\_md

---

<div class="post-metadata">

**Author:** ![micheldogger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b5e925/32.png) [@micheldogger](https://www.ruby-forum.com/u/micheldogger)\
**Post date:** [October 11, 2010, 1:42pm UTC](https://www.ruby-forum.com/t/testing-for-subarrays/196306/6 "2010-10-11T13:42:17Z")

</div>

David A. Black wrote:

> Here’s another way that is more verbose but that doesn’t create the  
> whole array (which probably doesn’t matter anyway, unless it’s a huge  
> array and you’re cycle-shaving). I also prefer extending individual  
> objects, rather than adding to Array.
> 
> module SubArrayFinder  
> def look\_up(sub\_array)  
> sub\_size = sub\_array.size  
> index = find\_index.with\_index do |e,i|  
> self[i, sub\_size] == sub\_array  
> end  
> return(index…index+sub\_size-1) if index  
> end  
> end

Comparing with my original proposal, a side question is whether using  
each\_cons is faster, or not, that iterating with self[i, sub\_size]…

\_md
