加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 范围与其他范围不冲突

发布时间:2020-12-17 02:07:22 所属栏目:百科 来源:网络整理
导读:所以我必须做一个处理以下情况的rails验证: 我有一组范围,我需要知道所要求的范围是否与任何这些范围发生冲突. 例如,我有以下范围: (0..3000) (3000..4000) (4000..5000) (6000..7000) 1..10会发生冲突,因为此范围已包含在0..3000中 1..3100会发生冲突,因
所以我必须做一个处理以下情况的rails验证:

我有一组范围,我需要知道所要求的范围是否与任何这些范围发生冲突.

例如,我有以下范围:

>(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_range
end

但我无法弄清楚如何以简单的方式处理其他案例.

解决方法

这是以正确方式观察时直截了当的问题之一,但在其他方面却是混乱和复杂的.经过几次错误的开始,我解决了这个问题,“如何避免重叠?

我假设数组中的范围是按照每个范围的结尾不大于下一个范围的开头并且每个范围的开始不小于前一个结尾的意义排序的.这就是你的例子.如果该条件不成立,则第一步是修改数组以使该条件成立,这并不困难.

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) #=> false
no_overlap?(arr,2800..4500) #=> false
no_overlap?(arr,2500..5500) #=> false
no_overlap?(arr,5000..6000) #=> true
no_overlap?(arr,0..500)  #=> true
no_overlap?(arr,8000..9000) #=> true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读