# Looking for something similar to in\_groups\_of but not really

**URL:** <https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700>\
**Category:** Rails\
**Created:** [April 2, 2008, 7:29pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700 "2008-04-02T19:29:33Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 2, 2008, 7:29pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/1 "2008-04-02T19:29:33Z")

</div>

i’m trying to figure out an elegant way of taking an array or  
enumerable object and dividing it as even as possible into sub arrays.

in\_groups\_of works fine if i’m trying to define the number of objects  
inside each sub array, but what if i just want to define how many sub  
arrays instead? is there a method for something like that or would i  
need to write something custom?

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 2, 2008, 7:46pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/2 "2008-04-02T19:46:39Z")

</div>

i found the transpose method which works unless i pass false to the  
options of in\_groups\_of.

> > users.in\_groups\_of(3, false).transpose

returns:

IndexError: element size differs (2 should be 3)  
from (irb):19:in `transpose’  
from (irb):19  
from :0

are there any workarounds for this?

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 2, 2008, 8:01pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/3 "2008-04-02T20:01:51Z")

</div>

Hmm… maybe not quite that easy… that formula leaves some holes in  
the distribution of elements…

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 2, 2008, 7:48pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/4 "2008-04-02T19:48:44Z")

</div>

X in\_groups\_of Y = Z, and you want Z to be fixed…

Assuming you know X (how big the array/collection is) and Z (the desired  
number of sub-arrays), the math is pretty simple. Something like:  
in\_groups\_of ((X/Z)+0.9999).to\_i or something like that

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 3, 2008, 3:39pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/5 "2008-04-03T15:39:33Z")

</div>

Josh K. wrote:

> i’m trying to figure out an elegant way of taking an array or  
> enumerable object and dividing it as even as possible into sub arrays.

Is your notion of “as even as possible” something like you want three  
sub-arrays to fill like this (where items are distributes as evenly as  
possible)?

Item Count SubArrays  
1 sa1 = [1] sa2 = [] sa3 = []  
2 sa1 = [1] sa2 = [2] sa3 = []  
3 sa1 = [1] sa2 = [2] sa3 = [3]  
4 sa1 = [1,2] sa2 = [3] sa3 = [4]  
5 sa1 = [1,2] sa2 = [3,4] sa3 = [5]  
6 sa1 = [1,2] sa2 = [3,4] sa3 = [5,6]  
7 sa1 = [1,2,3] sa2 = [4,5] sa3 = [6,7]  
8 sa1 = [1,2,3] sa2 = [4,5,6] sa3 = [7,8]  
9 sa1 = [1,2,3] sa2 = [4,5,6] sa3 = [7,8,9]  
10 sa1 = [1,2,3,4] sa2 = [5,6,7] sa3 = [8,9,10]

or as a dynamic number for in\_groups\_of would do?

where g = (len/3).ceil

array.len g SubArrays  
1 1 sa1 = [1] sa2 = [] sa3 = []  
2 1 sa1 = [1] sa2 = [2] sa3 = []  
3 1 sa1 = [1] sa2 = [2] sa3 = [3]  
4 2 sa1 = [1,2] sa2 = [3,4] sa3 = []  
5 2 sa1 = [1,2] sa2 = [3,4] sa3 = [5]  
6 2 sa1 = [1,2] sa2 = [3,4] sa3 = [5,6]  
7 3 sa1 = [1,2,3] sa2 = [4,5,6] sa3 = [7]  
8 3 sa1 = [1,2,3] sa2 = [4,5,6] sa3 = [7,8]  
9 3 sa1 = [1,2,3] sa2 = [4,5,6] sa3 = [7,8,9]  
10 4 sa1 = [1,2,3,4] sa2 = [5,6,7,8] sa3 = [9,10]

in\_groups\_of fills early rows rather than evenly distributing… note  
the ‘holes’ at 4, 7, 10, … that’s what prompted my last post  
yesterday

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 3, 2008, 5:48am UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/6 "2008-04-03T05:48:33Z")

</div>

Hey,

assuming an arbitrary sized array (I chose 100 elements below) and you  
want to split it all up into at most 3 groups:

x = (1…100).to\_a  
x.in\_groups\_of((x.length.to\_f / 3).ceil, false)

HTH,  
Trevor

On 4/2/08, Josh [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> from (irb):19
> from :0
> 
> ```
> 
> are there any workarounds for this?
> 
> >

## –

Trevor S.  
[http://somethinglearned.com](http://somethinglearned.com)

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 3, 2008, 3:47pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/7 "2008-04-03T15:47:45Z")

</div>

You might want to check this out:

[http://refactormycode.com/codes/167-split\_in\_groups-instead-of-in\_groups\_of](http://refactormycode.com/codes/167-split_in_groups-instead-of-in_groups_of)

---

<div class="post-metadata">

**Author:** ![jjkiesch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc79bd/32.png) [@jjkiesch](https://www.ruby-forum.com/u/jjkiesch)\
**Post date:** [April 3, 2008, 6:39pm UTC](https://www.ruby-forum.com/t/looking-for-something-similar-to-in-groups-of-but-not-really/133700/8 "2008-04-03T18:39:29Z")

</div>

exactly what i was looking for! thanks.
