只是一些更多的解決方案扔到池:
x = [1,2,3,"a","b",4]
numbers = x.select{ |e| e.is_a?(Fixnum) } # => [1, 2, 3, 4]
letters = x - numbers # => ["a", "b"]
numbers = x.select{ |e| e.kind_of?(Fixnum) } # => [1, 2, 3, 4]
letters = x - numbers # => ["a", "b"]
或
(numbers, letters) = x.group_by {|a| a.class}.values_at(Fixnum, String)
numbers # => [1, 2, 3, 4]
letters # => ["a", "b"]
隨着一些基準測試顯示如何了微妙的變化影響速度:
require 'benchmark'
x = [1,2,3,"a","b",4] * 100
n = 10_000
Benchmark.bm do |bench|
bench.report { n.times {
numbers = x.select{ |e| e.is_a?(Fixnum) }
letters = x - numbers
}}
bench.report { n.times {
numbers = x.select{ |e| e.kind_of?(Fixnum) }
letters = x - numbers
}}
bench.report { n.times {
(numbers, letters) = x.group_by {|a| a.class}.values_at(Fixnum, String)
}}
bench.report { n.times {
numbers, not_numbers = x.partition{|item| item.kind_of? Fixnum}
}}
end
# >> user system total real
# >> 4.270000 0.010000 4.280000 ( 4.282922)
# >> 4.290000 0.000000 4.290000 ( 4.288720)
# >> 5.160000 0.010000 5.170000 ( 5.163695)
# >> 3.720000 0.000000 3.720000 ( 3.721459)
+ 1爲單線和雙重任務。看起來不錯。 – slhck 2011-04-16 12:45:47
+1這對於速度來說也是一個可靠的勝利!查看我添加的基準。 – 2011-04-17 04:16:47
下面的答案使用'group_by',它允許分成兩個以上的組。 – 2013-10-26 04:02:05