在Ruby中,如何检查数组中至少80%的元素是否与模式匹配?

时间:2017-01-09 16:40:34

标签: arrays ruby regex matching ruby-2.4

我正在使用Ruby 2.4。如何检查数组中至少80%的元素是否与某个模式匹配?我想看看每个元素是否与正则表达式匹配

/\d\d?\s*-\s*\d\d?/

3 个答案:

答案 0 :(得分:2)

您可以将Enumerable#grep与简单数学结合使用:

array.grep(/\d\d?\s*-\s*\d\d?/).size / array.size.to_f >= 0.8

要进一步缩短此范围,您可以使用Numeric#quoNumeric#fdiv

array.grep(/\d\d?\s*-\s*\d\d?/).size.quo(array.size) >= 0.8

答案 1 :(得分:1)

如果表现确实很重要,您无需检查所有元素,以了解其中至少80%的元素是否处于加工状态

使用ruby 2.3,这个实现比count解决方案快一点,比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?/}

答案 2 :(得分:0)

我会写:

(array.count{|item| item =~ /\d\d?\s*-\s*\d\d?/} / array.size) >= 0.8