如何过滤和去除阵列?

时间:2013-06-07 11:10:51

标签: ruby arrays

我有一个数组:

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一样的函数?

2 个答案:

答案 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]