2014-01-27 25 views
4

我知道我可以很容易地得到這樣的:數組選擇獲取true和false數組?

array = [45, 89, 23, 11, 102, 95] 
lower_than_50 = array.select{ |n| n<50} 
greater_than_50 = array.select{ |n| !n<50} 

但有隻運行一次select得到這個方法(或優雅的方式)?

[lower_than_50, greater_than_50] = array.split_boolean{ |n| n<50} 
+1

您正在查找[Array#partition](http://www.ruby-doc.org/core-2.1.0/Enumerable.html#method-i-partition)。 – mudasobwa

回答

9
over, under_or_equal = [45, 89, 23, 11, 102, 95].partition{|x| x>50 } 

或者乾脆:

result = array.partition{|x| x>50 } 
p result #=> [[89, 102, 95], [45, 23, 11]] 

,如果你想比較的結果作爲一個數組兩個子陣列。

編輯:作爲獎勵,這裏是你會怎樣,如果你有兩個以上的選擇,並要分割的數字:

my_custom_grouping = -> x do 
    case x 
    when 1..50 then :small 
    when 51..100 then :large 
    else    :unclassified 
    end 
end 

p [-1,2,40,70,120].group_by(&my_custom_grouping) #=> {:unclassified=>[-1, 120], :small=>[2, 40], :large=>[70]} 
+1

紅寶石真漂亮! :) –

0

上面的答案是當場上!

下面是兩個以上的分區的通用解決方案(例如:<20, <50, >=50):

arr = [45, 89, 23, 11, 102, 95] 
arr.group_by { |i| i < 20 ? 'a' : i < 50 ? 'b' : 'c' }.sort.map(&:last) 
=> [[11], [45, 23], [89, 102, 95]] 

如果你通過塊分組(或如模任何數學可計算的指數),這是非常有用的:

arr.group_by { |i| i/50 }.sort.map(&:last) 
=> [[45, 23, 11], [89, 95], [102]]