【问题标题】:Searching for range overlaps in Ruby hashes在 Ruby 哈希中搜索范围重叠
【发布时间】:2014-01-30 15:36:55
【问题描述】:

假设你有以下 Ruby 哈希,

hash = {:a => [[1, 100..300],
               [2, 200..300]],
        :b => [[1, 100..300], 
               [2, 301..400]]
       }

还有以下功能,

def overlaps?(range, range2)
  range.include?(range2.begin) || range2.include?(range.begin)
end

def any_overlaps?(ranges)
  # This calls to_proc on the symbol object; it's syntactically equivalent to 
  # ranges.sort_by {|r| r.begin} 
  ranges.sort_by(&:begin).each_cons(2).any? do |r1, r2|
    overlaps?(r1, r2)
  end
end

对于hash 中的每个键,您希望测试任何范围是否与其他范围重叠。在上面的hash 中,我希望hash[:a] 会让我生气,而hash[:b] 不会。

如何在语法上最好地实现?

【问题讨论】:

  • 我喜欢你的解决方案,没有什么要补充的。除了使用一些类似的方法overlaps?,如果希望使代码更紧凑。

标签: ruby hash


【解决方案1】:
hash.each{|k, v| puts "#{k} #{any_overlaps?( v.map( &:last )) ? 'overlaps' : 'is ok'}."}

输出:

a overlaps.
b is ok.

【讨论】:

    【解决方案2】:

    这是any_overlaps的另一种写法:

    def any_overlaps?(ranges)
      (a = ranges.map { |r| [r.first, r.last] }.sort_by(&:first).flatten) != a.sort 
    end
    
    any_overlaps? [(51..60),(11..20),(18..30),(0..10),(31..40)] # => true
    any_overlaps? [(51..60),(11..20),(21..30),(0..10),(31..40)] # => false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多