数组中值的Ruby计数范围

数组中值的Ruby计数范围,ruby,arrays,Ruby,Arrays,我有一个数组: [1,2,3,4,5,6,7,8,9,10] 我需要数三件不同的事情 1) 所有小于或等于6的值 2) 所有值均等于7或8 3) 所有大于8的值 在不计算单个值并将它们全部相加的情况下,执行此操作的最佳方法是什么?与块一起使用 [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

我有一个数组:

[1,2,3,4,5,6,7,8,9,10]
我需要数三件不同的事情

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

2) 所有值均等于
7
8

3) 所有大于
8
的值

在不计算单个值并将它们全部相加的情况下,执行此操作的最佳方法是什么?

与块一起使用

[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 }
[1,2,3,4,5,6,7,8,9,10].计数{val | val 8}
与块一起使用

[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 }
[1,2,3,4,5,6,7,8,9,10].计数{val | val 8}
arr=[1,2,3,4,5,6,7,8,9,10]
arr.select{| e | e 6
arr.select{| e | e==7 | | e==8}.size
#=> 2
arr.select{| e | e>8}.size
#=> 2
arr=[1,2,3,4,5,6,7,8,9,10]
arr.select{| e | e 6
arr.select{| e | e==7 | | e==8}.size
#=> 2
arr.select{| e | e>8}.size
#=> 2

更有趣的是,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]
a=[1,2,3,4,5,6,7,8,9,10]
a、 注入([0,0,0]){| arr,i |[arr[0]+(i6和i8?1:0)]}
a、 在(7)之前切片。在(9)之前映射{arr}arr.slice_。展平(1)。映射(&:大小)
# => [6, 2, 2]
编辑:另一个,灵感来自@staafl的答案:

arr.group_by {|e| (e+1)/2-4<=>0}.values.map(&:size)
arr.group_by{e|(e+1)/2-40}.values.map(&:size)

你能推荐其他人吗?

更有趣的是,我用一句话(不含分号)回答@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]
a=[1,2,3,4,5,6,7,8,9,10]
a、 注入([0,0,0]){| arr,i |[arr[0]+(i6和i8?1:0)]}
a、 在(7)之前切片。在(9)之前映射{arr}arr.slice_。展平(1)。映射(&:大小)
# => [6, 2, 2]
编辑:另一个,灵感来自@staafl的答案:

arr.group_by {|e| (e+1)/2-4<=>0}.values.map(&:size)
arr.group_by{e|(e+1)/2-40}.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}
>hash=hash.new(0)
>>arr=[1,2,3,4,5,6,7,8,9,10]
>>arr.each{e|hash[(e-7.5).truncate0]+=1}
>>散列
=> {-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}
arr=[1,2,3,4,5,6,7,8,9,10] >>arr.each_与_对象(Hash.new(0)){e,h|h[(e-7.5).truncate0]+=1} => {-1=>6, 0=>2, 1=>2}
这个怎么样:

>> 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}
>hash=hash.new(0)
>>arr=[1,2,3,4,5,6,7,8,9,10]
>>arr.each{e|hash[(e-7.5).truncate0]+=1}
>>散列
=> {-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}
arr=[1,2,3,4,5,6,7,8,9,10] >>arr.each_与_对象(Hash.new(0)){e,h|h[(e-7.5).truncate0]+=1} => {-1=>6, 0=>2, 1=>2}

你的意思是添加,或计数频率?在数组中循环一次。然后执行其中的所有操作。你的意思是添加,或计数频率?在数组中循环一次。然后执行其中的所有操作。循环三次???@0v3rc10ck3d有不止一种方法。当然不止一种方法。最快/最有效的方法不是m吗最有趣的方法;)循环三次???@0v3rc10ck3d有不止一种方法。当然不止一种。最快/最有效的方法不是最有趣的方法吗;)这似乎是找到我需要的值的最干净的方法。谢谢!这似乎是找到我需要的值的最干净的方法。谢谢!这些帖子都是预发布的tty令人大开眼界……我对ruby不太熟悉,看到了很多完成某件事的方法,真是不可思议。聪明!当然还有,
.values
=>[6,2,2]。你也可以将块写成
{e,h | h[(e+1)/2-40]+=1}
@CarySwoveland,我相信
.values
的顺序没有定义。如果需要数组,我们可能应该使用
.values\u at(-1,0,1)
来明确它,或者使用
.values\u at(*-1..1)
如果我们聪明的话:-)整数除法的良好使用我相信我们对v1.9+没问题,就像现在一样。顺便说一句,
值的良好使用在
上。这些帖子让人大开眼界……我对ruby还不熟悉,看到了很多方法来完成一些事情是不可思议的。聪明!当然,
=>[6,2,2]。您也可以将块写为
{e,h | h[(e+1)/2-40]+=1}
@CarySwoveland,我相信
.values
的顺序是未定义的。如果需要数组,我们可能应该使用
.values\u at(-1,0,1)
使其显式,或
.values\u at(*-1..1)
如果我们聪明的话:-)整数除法的良好使用我相信我们可以使用v1.9+,就像现在一样。顺便说一句,
的值的良好使用。