java - 在java中设置间隔

标签 java algorithm guava intervals interval-tree

我有一个包含整数值的间隔列表 [例如。 [1, 4], [10, 19] 等]。有没有办法将这些间隔放入某些 java 集合的容器中 [例如。 Set] 这样我就可以在容器上调用“联合”函数。 'union' 函数应该给我一个间隔列表,这样如果任何 2 个插入的间隔重叠,那么它们应该合并到输出中。 我尝试在 Guava 中使用 Range 类,但最终在合并之前将所有间隔相互比较。一个优雅的方法将非常感激!这是我根据下面的回复尝试过的。输出是 [[1, 15], [17, 20]],这是正确的。我想知道是否有一些现有的 API 可以实现类似的功能。

public static void main(String[] args) {
    // mock data
    List<MyIntRange> rng_lst = new ArrayList<Junk.MyIntRange>();
    rng_lst.add(new MyIntRange(1, 10));
    rng_lst.add(new MyIntRange(5, 15));
    rng_lst.add(new MyIntRange(17, 20));

    // sort intervals by start position
    Collections.sort(rng_lst);

    // merge the intervals which overlap
    List<MyIntRange> res_lst = new ArrayList<Junk.MyIntRange>();
    MyIntRange old_rng = null;
    for (MyIntRange cur_rng : rng_lst) {
        if (old_rng == null) {
            old_rng = cur_rng;
        } else {
            if (old_rng.rng.upperEndpoint() < cur_rng.rng.lowerEndpoint()) {
                // this does not over lap with the next one
                res_lst.add(old_rng);
                old_rng = cur_rng;
            } else {
                // overlap
                old_rng = new MyIntRange(old_rng.rng.lowerEndpoint(),
                        cur_rng.rng.upperEndpoint());
            }
        }
    }
    // add the last range
    res_lst.add(old_rng);

    // done!
    System.out.println(res_lst);
}

// wrapper around Guava's Range to make it comparable based on the
// interval's start
public static class MyIntRange implements Comparable<MyIntRange> {
    Range<Integer> rng;

    public MyIntRange(int start, int end) {
        rng = Ranges.closed(start, end);
    }

    public int compareTo(MyIntRange that) {
        int res = -1;
        if (this.rng.lowerEndpoint() > that.rng.lowerEndpoint()) {
            res = 1;
        }
        return res;
    }

    public String toString() {
        return "[" + rng.lowerEndpoint() + ", " + rng.upperEndpoint() + "]";
    }
}

谢谢

最佳答案

这基本上正是 RangeSet 在刚刚发布的 Guava 14.0 中所做的,除了它为您进行合并,而不是告诉您可以合并哪些范围。

关于java - 在java中设置间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149227/

相关文章:

java - 我可以在 Apache Derby 版本 10.11 中使用 MERGE INTO 吗?

Java 打印托盘选择 Saga

algorithm - 产品 p 有多少个 n 位数字

java - 有序表数据结构

java - 尝试获取 Google 日历服务时出错

java - 递归树怎么画

java - 我应该如何使用 servlet 和 Ajax?

algorithm - 在 O(n) 时间内排序?

c - 在 C 中查找数组中的 n 个重复数字

java - 如何将字符串拆分为固定长度的 block ,但不在单词之间?