1

私は配列を持っています:

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

3つの別々のものを数える必要があります。

1) 以下のすべての値6

2) すべての値が7またはに等しい8

3) より大きいすべての値8

個々の値をカウントしてそれらをすべて加算せずにこれを行う最良の方法は何ですか?

4

4 に答える 4

3

ブロックで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 }
于 2013-10-12T03:53:34.113 に答える
2
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
于 2013-10-12T03:55:14.677 に答える
0

もっと興味深いのは、@Luigi の 3 つの質問に 1 つのステートメント (セミコロンを含まない) で答えるということです。これを行うには、次の 2 つの方法があります。

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)

他の人を提案できますか?

于 2013-10-12T07:11:21.493 に答える