将元素插入ArrayList,例如interval java

时间:2015-04-27 16:24:11

标签: java arrays loops for-loop arraylist

第一个例子:我有范围

[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],然后循环遍历它们。我比较它是否是最小数字等的较小。

但是,我似乎无法使用此方法。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

查看Guava Range 类和RangeSet 接口的实现。

  

选择支持add(Range)操作的实现需要忽略空范围并合并连接的范围。

答案 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介于minArraymaxArray之间,请更改max的maxArray值(以及min {} 1}}介于maxminArray之间。

如果值不在您的某个范围内,您不会说明会发生什么,所以我没有假设。另外,我相信你可以从这里弄清楚。

答案 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);
    }
}
  1. 从最小范围到最大范围测试,如果没有相交,则添加到结尾
  2. 如果任何现有范围相交,请将其与新范围合并。
  3. 然后测试合并范围现在是否与列表中的下一个现有范围相交,如果是,则合并它。重复3,直到新范围与下一个范围不相交。