在 Ruby 中,如何检查数组中是否至少有 80% 的元素与模式匹配?
In Ruby, how do I check if at least 80% of elements in an array match a pattern?
我正在使用 Ruby 2.4。如何检查数组中至少 80% 的元素是否与特定模式匹配?我想看看每个元素是否匹配正则表达式
/\d\d?\s*-\s*\d\d?/
您可以将 Enumerable#grep
与简单的数学结合使用:
array.grep(/\d\d?\s*-\s*\d\d?/).size / array.size.to_f >= 0.8
要进一步缩短此时间,您可以使用 Numeric#quo
or Numeric#fdiv
:
array.grep(/\d\d?\s*-\s*\d\d?/).size.quo(array.size) >= 0.8
我会写:
(array.count{|item| item =~ /\d\d?\s*-\s*\d\d?/} / array.size) >= 0.8
如果性能确实很重要,则无需检查所有元素即可了解是否至少有 80% 的元素正在满足条件
对于 ruby 2.3,此实现比计数解决方案快一点,比 grep 解决方案快两倍:
def pareto_match(array, proportion: 0.8)
min_success= (array.count * proportion).round(4)
max_failures= (array.count * (1 - proportion)).round(4)
success= 0
failure= 0
array.each do |element|
if yield(element)
success+= 1
return true if success >= min_success
else
failure+= 1
return false if failure > max_failures
end
end
end
pareto_match(array){|e| e =~ /\d\d?\s*-\s*\d\d?/}
我正在使用 Ruby 2.4。如何检查数组中至少 80% 的元素是否与特定模式匹配?我想看看每个元素是否匹配正则表达式
/\d\d?\s*-\s*\d\d?/
您可以将 Enumerable#grep
与简单的数学结合使用:
array.grep(/\d\d?\s*-\s*\d\d?/).size / array.size.to_f >= 0.8
要进一步缩短此时间,您可以使用 Numeric#quo
or Numeric#fdiv
:
array.grep(/\d\d?\s*-\s*\d\d?/).size.quo(array.size) >= 0.8
我会写:
(array.count{|item| item =~ /\d\d?\s*-\s*\d\d?/} / array.size) >= 0.8
如果性能确实很重要,则无需检查所有元素即可了解是否至少有 80% 的元素正在满足条件
对于 ruby 2.3,此实现比计数解决方案快一点,比 grep 解决方案快两倍:
def pareto_match(array, proportion: 0.8)
min_success= (array.count * proportion).round(4)
max_failures= (array.count * (1 - proportion)).round(4)
success= 0
failure= 0
array.each do |element|
if yield(element)
success+= 1
return true if success >= min_success
else
failure+= 1
return false if failure > max_failures
end
end
end
pareto_match(array){|e| e =~ /\d\d?\s*-\s*\d\d?/}