因此,通过上述练习,在GitHub上找到了这个解决方案.
def count_between arr, lower, upper
return 0 if arr.length == 0 || lower > upper
return arr.length if lower == upper
range = (lower..upper).to_a
arr.select { |value| range.include?(value) }.length
end
Run Code Online (Sandbox Code Playgroud)
我理解前三行是什么意思,以及为什么他们返回他们所做的值.我想了解的是以下几行代码.
第4行(下面)将"range"定义为变量,并使用lower ... upper作为范围变量(刚发现你不需要在一个范围内放置一个整数值.'.to_a'是什么意思,似乎无法在ruby文档中找到它,它有什么作用?
range = (lower..upper).to_a
Run Code Online (Sandbox Code Playgroud)
第5行(下面)使用的是Array#select方法,如果该值包含在此范围内,则选择此值,然后给出所有选定值的Array#length,但我不太明白A. what |值| 正在做什么,它意味着什么.B. range.include?(value)表示此值包含在我假设的范围内.
arr.select { |value| range.include?(value) }.length
Run Code Online (Sandbox Code Playgroud)
实际上,我简化了这个:
def count_between arr, lower, upper
return 0 if lower > upper
arr.count{|v| (lower..upper).include?(v)}
end
Run Code Online (Sandbox Code Playgroud)
to_a记录在这里 ; 它返回一个包含Range中每个元素的Array.但是,to_a在调用之前没有理由调用Range include?.
也没有理由对空数组进行特殊处理.
当lower等于upper没有意义时返回数组的长度.
value是为块调用的值赋予的名称.我认为v对于这样一个微不足道的案例来说,简单就更好了.
select为每个值调用块arr并返回一个包含块返回的元素的新Array true,因此新Array的长度是匹配值的数量.但是,count存在,并且更有意义使用,因为计数是我们所关心的.
更新:正如@steenslag在评论中指出的那样,可比较#之间?可以使用而不是创建要调用的Range,这样就include?不需要确保lower小于或等于upper:
def count_between arr, lower, upper
arr.count{|v| v.between?(lower, upper)}
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |