1

我有一个数组:

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

4

2 回答 2

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?)
于 2013-06-07T11:12:23.257 回答
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]
于 2013-06-07T11:55:17.040 回答