第一个例子:我有范围
[10, 30] [80, 100] [150, 200]
我必须插入例如[90, 120]
。插入之后,结果范围将为:
[10, 30] [80, 120] [150, 200]
这是因为范围[100, 120]
不在原始范围内,所以100增加到120,但不会添加90,因为它在80到120的范围内。
同样,如果我要将[50, 90]
添加到原始范围,则结果范围将为
[10, 30] [50, 100] [150, 200]
这次,下限减小到50,扩大了下边的范围,但忽略了90,因为它已经在[80, 100]
范围内。我正在尝试创建一个类来表示这个问题。
目前,我将起始编号放入ArrayListStart [10, 80, 150]
,将结束编号放入ArrayListEnd [30, 100, 200]
,然后循环遍历它们。我比较它是否是最小数字等的较小。
但是,我似乎无法使用此方法。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
我认为你有类似的东西:
private Integer[] minArray = new Integer[]{10,80,150};
private Integer[] maxArray = new Integer[]{30,100,200};
所以你要找的是这样的:
private void changeRange(int min, int max) {
boolean found = false;
int position=0;
while(position<minArray.length && !found) {
if(min>minArray[position] && min<maxArray[position]) {
found = true;
if(max>maxArray[position]) {
maxArray[position] = max;
}
} else if(max>minArray[position] && max<maxArray[position]) {
found = true;
if(min<minArray[position]) {
minArray[position] = min;
}
} else {
position++;
}
}
}
因此,如果您的min
介于minArray
和maxArray
之间,请更改max
的maxArray值(以及min
{} 1}}介于max
和minArray
之间。
如果值不在您的某个范围内,您不会说明会发生什么,所以我没有假设。另外,我相信你可以从这里弄清楚。
答案 2 :(得分:0)
class Range { int left, right; }
ArrayList<Range> list;
boolean intersects(Range r1, Range r2) { /* tests if 2 ranges intersect */ };
Range join (Range r1, Range r2) { /* joins two ranges */ }
void add(Range r) {
int i;
for (i=0; i < list.size(); i++) {
if (intersects(list.get(i), r)) {
list.set(i, join(list.get(i), r));
while (i + 1 < list.size() && intersects(list.get(i), list.get(i+1)) {
Range rtemp = list.remove(i+1);
list.set(i, join(list.get(i), rtemp));
}
break;
}
}
if (i == list.size()) {
list.add(r);
}
}