我有一个数组:
arr = [1,1,2,3,5,8,13,21,34]
我想以与select
相同的方式过滤数组,但也要分别收集所有不符合条件的元素:
[evens, odds] = arr.split_filter {|p| p % 2 == 0}
# evens = [2, 8, 34]
# odds = [1, 1, 3, 5, 13, 21]
我能做到
evens = arr.select {|p| p % 2 == 0}
odds = arr.select {|p| p % 2 != 0}
但这似乎效率低下。有谁知道一个像split_filter
一样的函数?
答案 0 :(得分:12)
您正在寻找Enumerable#partition:
arr = [1,1,2,3,5,8,13,21,34]
evens, odds = arr.partition{|a| a % 2 == 0}
evens # => [2, 8, 34]
odds # => [1, 1, 3, 5, 13, 21]
或者,更短的版本:
evens, odds = arr.partition(&:even?)
答案 1 :(得分:1)
我们可以随时使用Enum#group_by
。
arr = [20,1,1,2,3,5,8,13,21,34]
even,odd = arr.group_by(&:even?).values_at(true,false)
even #=> [20, 2, 8, 34]
odd #=> [1, 1, 3, 5, 13, 21]