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.
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
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
We then return the