How to split arrays

Notes on the Le Wagon Iteratros & Blocks Splitter exercise

We want to create a splitter method which will take an array and divide it into two groups according to an arbitrary rule. You might want to split by age if we’re talking about a group of people.

Lets implement a method `size_splitter` which takes two parameters: an array, and a integer (the size). We will assume that the array only contains words, e.g. Strings, and that the arbitrary rule is to form two groups: the first one with words of the given size (second parameter of the method), and the other group with all the other words.

The `size_splitter` method should return an array of two arrays - the two groups defined above - with the contents sorted alphabetically.

``````  def size_splitter(array, size)
size_array = array.select do |word|
word.length == size
end
other_array = array.reject do |word|
word.length == size
end
combined_array = []
combined_array.push(size_array.sort, other_array.sort)
return combined_array
end
``````

We start by calling the method `.select` on to the array. The block then check to see if each word in the array is of the length size and if it is it is added to the `size_array`.

The other array uses to `.reject` to add words not equal to the length of size to the array. It bascially rejects words that are equal to size.

We then set the `combined_array` to empty and use the ruby method `.push` to add in each array along with the `.sort` method which orders them alphabetically.

In the previous exercise, the abritrary rule was fixed. What if we wanted to let the method caller choose which rule to apply? We can do so with the power of blocks and yield.

``````def block_splitter(array)
true_array = array.select do |word|
yield(word) == true && word.start_with?("a")
end
other_array = array.reject do |word|
yield(word) == true
end
new_array = []
new_array.push(true_array, other_array)
return new_array
end
``````

This is the same concept although here we use `yield` with the parameter of `word` which allows the user to customzie the rule. This is then checked against whether it is equal to true and also equal to the word starting with an “a”. The second array then rejects anything which is not true.

The new_array is created and set to empty and we use `.push` to both the `true_array` and the `other_array` into the `new_array`.

We then return the `new_array`.