如果没有间隔重叠,我必须实施。
Intervalls看起来像这样:
0-100
100-200
200-500
500-1000
1000-2000 ect....
现在,intervalls分别存储在一个arraylist中,其中min(0,100,200,500 ...)和max(100,200,500 ...)
如果我添加新的Intervall,我必须检查现有的intervalls是否没有重叠。 例如:
250-280还可以 300-600不行
但是,我不知道该怎么做?
答案 0 :(得分:5)
您可以使用interval tree data structure执行此任务,并仅在间隔中没有碰撞/交叉点时添加元素。
答案 1 :(得分:1)
对于间隔(a,b)
1循环列表
2如果a
落在其中一个区间内,则区间重叠。
3找到两个间隔a
之间的ge
4与b
重复。如果b
在任何区间内,它会重叠。
5如果a
和b
介于两个相同的区间之间,则它们不会重叠。否则他们重叠。
当然,在开始算法之前,Yob建议使用单个arraylist并将间隔作为对象进行管理。
答案 2 :(得分:1)
现在,intervalls分别存储在一个arraylist中 min(0,100,200,500 ...)和max(100,200,500 ...)
所以......
bool isCollided = false;
Integer min = 250;
Integer max = 280;
for(Integer intOne: firstList){
Integer intTwo = secondList.get(firstList.indexOf())
if( (min >= intOne && <= intTwo) || (max >= intOne && <= intTwo){
isCollided = true;
break;
}
}
但我可能像其他人建议的那样创建自己的课程。
答案 3 :(得分:0)
您可能创建了一个包含开头和结尾的Interval对象,并将其放入ArrayList中。
您可以在此Class上轻松实现可以检测冲突的方法:
public boolean hasCollision(Interval inter){....}
现在在插入之前迭代你的集合并调用hasCollision()方法......
我想要优化结果,您还可以使Interval对象实现Comparable
并使用Sorted集合。
答案 4 :(得分:0)
由于间隔不重叠,您可以按照下限对它们进行排序。要查找给定的间隔是否与某个现有间隔重叠,可以使用二分搜索,这样搜索时间就是log(N)。
我建议您创建class Interval implements Comparable<Interval>
,并使用java.util.TreeMap<Integer, Interval>
。关键是下限和上限之和。插入新的Interval i
时,只需检查两个条目的重叠:map.floorEntry(i.key())
和map.lowerEntry(i.key())
。
答案 5 :(得分:0)
您可以按起点对其进行排序,例如在NavigableMap。
NavigableMap<Integer, Integer> map =
map.put(100, 200);
map.put(300, 500);
// to test for a range.
int start = 300, end = 400;
if (map.floorEntry(start).getValue() >= start && map.ceilingKey(start) <= end)
// out of existing ranges.
此操作为O(ln N)
答案 6 :(得分:0)
有一种简单的方法作为实用方法
public static boolean isOverlapping(Date start1,Date end1,Date start2,Date end2){ return start1.before(end2)&amp;&amp; start2.before(END1); }