我有一组范围,我需要知道所要求的范围是否与任何这些范围发生冲突.
例如,我有以下范围:
>(0..3000)
>(3000..4000)
>(4000..5000)
>(6000..7000)
> 1..10会发生冲突,因为此范围已包含在0..3000中
> 1..3100会发生冲突,因为此范围部分包含在0..3000和3000.4000之间
> 2800..4500会发生冲突,因为此范围部分包含在0..3000,3000..4000和4000..5000之间
> 5000..6000不会发生冲突
我唯一能做到的就是这一行的第一个也是最简单的案例:
def is_not_conflictive_range? ranges = ServicePrice.where(property: self.property).pluck(:from_value,:to_value).map { |range| range.first..range.second } conflictive_range = ranges.find do |range| range.include? (self.from_value..self.to_value) end errors.add(:service_price,"range from #{self.from_value} to #{self.to_value} is including in existing range from #{conflictive_range.first} to #{conflictive_range.last}") if conflictive_rangeend
但我无法弄清楚如何以简单的方式处理其他案例.
解决方法 这是以正确方式观察时直截了当的问题之一,但在其他方面却是混乱和复杂的.经过几次错误的开始,我解决了这个问题,“如何避免重叠?我假设数组中的范围是按照每个范围的结尾不大于下一个范围的开头并且每个范围的开始不小于前一个结尾的意义排序的.这就是你的例子.如果该条件不成立,则第一步是修改数组以使该条件成立,这并不困难.
码
def no_overlap?(arr,range) range.last <= arr.first.first || range.first >= arr.last.last || arr.each_cons(2).any? { |r1,r2| range.first >= r1.last && range.last <= r2.first }end
例子
arr = [1000..3000,3000..4000,4000..4000,4000..5000,6000..7000]no_overlap?(arr,1..1010) #=> falseno_overlap?(arr,2800..4500) #=> falseno_overlap?(arr,2500..5500) #=> falseno_overlap?(arr,5000..6000) #=> trueno_overlap?(arr,0..500) #=> trueno_overlap?(arr,8000..9000) #=> true总结
以上是内存溢出为你收集整理的ruby-on-rails – 范围与其他范围不冲突全部内容,希望文章能够帮你解决ruby-on-rails – 范围与其他范围不冲突所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)