Ruby array (enumerated) method for selecting and rejecting into 2 arrays in 1 operation

# this code works list = (0..20).to_a # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] odd = list.select { |x| x.odd? } # => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] list.reject! { |x| x.odd? } # => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] # but can i emulate this type of functionality with an enumerable method? set = [1,5,10] # => [1, 5, 10] one, five, ten = set # => [1, 5, 10] one # => 1 five # => 5 ten # => 10 # ------------------------------------------------ # method I am looking for ? list = (0..20).to_a odd, even = list.select_with_reject { |x| x.odd? } # put the matching items into the first variable # and the non-matching into the second 
+7
source share
4 answers

Of course you can do:

 odd, even = list.partition &:odd? 
+11
source
 odd = [] even = [] list = [1..20] list.each {|x| x.odd? ? odd << x : even << x } 
+1
source

As pguardiario said, the partition method is the most direct way. You can also use Set#divide :

 require 'set' list = (1..10).to_a odd, even = Set.new(list).divide(&:odd?).to_a.map{|x| x.to_a} 
0
source

You can try the following:

 odd,even = (0..20).group_by(&:odd?).values p odd,even 

Output:

 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 
0
source

All Articles