1

我有一个数组:

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

我需要计算三个不同的东西。

1) 所有小于或等于 的值6

2) 所有值等于78

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

imo 更有趣的是用一个语句(不包含分号)回答@Luigi 的三个问题。这里有两种方法:

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 回答
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}
于 2013-10-12T07:34:13.670 回答