2013-10-12 36 views
0

我有一個數組:紅寶石計數值的範圍在陣列

[1,2,3,4,5,6,7,8,9,10] 

和我需要計數三個單獨的東西。

1)所有值小於或等於6

2)所有值等於78。所有的值大於8

什麼是最好的方式來做到這一點,而不計算單個值並將它們加在一起?

+0

你的意思是_add_,或_count frequency_? – zeantsoi

+0

循環一次數組。並做所有的操作。 – AshwinKumarS

回答

1
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 
+0

這似乎是找到我需要的最清潔的方法。謝謝! – Luigi

2

使用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 } 
+0

循環三次? – AshwinKumarS

+0

@ 0v3rc10ck3d有多種方法可以做到這一點。 – squiguy

+0

當然不止一種方式。最快/效率最高的將是最有趣的方法;) – AshwinKumarS

0

更有趣,國際海事組織,是回答@路易吉與(不包含分號)一個語句的三個問題。這裏有兩種方法可以做到這一點:

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) 

您能否提供其他人呢?

0

如何:

>> 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} 
+1

這些帖子非常讓人大開眼界......我是紅寶石新手,看到用各種方式完成某件事情都是令人難以置信的。 – Luigi

+1

聰明!當然,'.values' => [6,2,2]。您也可以將塊寫爲'{| e,h | h [(e + 1)/ 2-4 <=> 0] + = 1}'。 –

+0

@CarySwoveland,我相信'.values'的順序是不確定的。如果需要數組,我們可能應該使用'.values_at(-1,0,1)'使其明確,或者'.values_at(* - 1..1)'如果我們聰明:-) – staafl