我有一個數組:紅寶石計數值的範圍在陣列
[1,2,3,4,5,6,7,8,9,10]
和我需要計數三個單獨的東西。
1)所有值小於或等於6
。
2)所有值等於7
或8
。所有的值大於8
。
什麼是最好的方式來做到這一點,而不計算單個值並將它們加在一起?
我有一個數組:紅寶石計數值的範圍在陣列
[1,2,3,4,5,6,7,8,9,10]
和我需要計數三個單獨的東西。
1)所有值小於或等於6
。
2)所有值等於7
或8
。所有的值大於8
。
什麼是最好的方式來做到這一點,而不計算單個值並將它們加在一起?
arr = [1,2,3,4,5,6,7,8,9,10]
arr.select {|e| e <= 6}.size
#=> 6
arr.select {|e| e == 7 || e == 8}.size
#=> 2
arr.select {|e| e > 8}.size
#=> 2
這似乎是找到我需要的最清潔的方法。謝謝! – Luigi
使用Enumerable#count與塊。
[1,2,3,4,5,6,7,8,9,10].count { |val| val <= 6 }
[1,2,3,4,5,6,7,8,9,10].count { |val| val == 7 || val == 8 }
[1,2,3,4,5,6,7,8,9,10].count { |val| val > 8 }
循環三次? – AshwinKumarS
@ 0v3rc10ck3d有多種方法可以做到這一點。 – squiguy
當然不止一種方式。最快/效率最高的將是最有趣的方法;) – AshwinKumarS
更有趣,國際海事組織,是回答@路易吉與(不包含分號)一個語句的三個問題。這裏有兩種方法可以做到這一點:
a = [1,2,3,4,5,6,7,8,9,10]
a.inject([0,0,0]) {|arr,i| [arr[0]+(i<7 ? 1:0), arr[1]+((i>6 and i<9) ? 1:0), arr[2]+(i>8 ? 1:0)]}
a.slice_before(7).to_a.map {|arr| arr.slice_before(9).to_a}.flatten(1).map(&:size)
# => [6, 2, 2]
編輯:另外,通過@ staafl的回答啓發:
arr.group_by {|e| (e+1)/2-4<=>0}.values.map(&:size)
您能否提供其他人呢?
如何:
>> hash = Hash.new(0)
>> arr = [1,2,3,4,5,6,7,8,9,10]
>> arr.each { |e| hash[(e-7.5).truncate<=>0]+=1 }
>> hash
=> {-1=>6, 0=>2, 1=>2}
甚至更簡潔:
>> arr = [1,2,3,4,5,6,7,8,9,10]
>> arr.each_with_object(Hash.new(0)) { |e,h| h[(e-7.5).truncate<=>0]+=1 }
=> {-1=>6, 0=>2, 1=>2}
你的意思是_add_,或_count frequency_? – zeantsoi
循環一次數組。並做所有的操作。 – AshwinKumarS