有没有办法返回一组合并为一个对象的对象?

时间:2018-10-04 17:28:36

标签: java

所以我有一个对象列表,这些对象是间隔,例如[2-10]。左端始终小于右端(开始<结束)。

现在说我计算间隔的并集, 像[2-9]和[10-12],我想将[2-9,10-12]作为单个对象返回

仅使用间隔对象列表,有什么方法可以返回该间隔实例吗?

此外,非数字字符是从我的toString方法构建的,不要被混淆为对象本身的一部分。

2 个答案:

答案 0 :(得分:1)

一旦您获得List中的IntervalUnion,就可以使用已经实现的toString方法根据需要打印它。打印列表会像

public static void main(String... args) throws InterruptedException {

    List<MyInterval> myList = new ArrayList<>();
    myList.add(new MyInterval(5, 10));
    myList.add(new MyInterval(20, 30));
    System.out.println(myList.toString());
}

static class MyInterval {
    int x, y;
    MyInterval(int x, int y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public String toString() {
        return x + "-" + y;
    }
}

哪些印刷品

[5-10, 20-30]

因此,完全符合要求。现在,将MyInterval与合并间隔联合的 collection 交换,即可完成。

答案 1 :(得分:0)

我建议为您的IntervalUnion类使用新的结构,该结构可以处理多个起点和终点。

警告:此联合实现不正确。此实现清空了您合并的两个时间间隔。如果将[1,4]和[2,6]合并,则不会获得预期的结果[1,6]

public class Interval {

    List<Integer> starts = new ArrayList<>();
    List<Integer> ends = new ArrayList<>();

    public Interval() {
    }

    public Interval(int start, int end) {
        starts.add(start);
        ends.add(end);
    }

    public Interval union(Interval interval) {
        Interval result = new Interval();
        while(this.starts.size()>0||interval.starts.size()>0){
            if(!this.starts.isEmpty() && this.starts.get(0) <= interval.starts.get(0)) {
                result.starts.add(this.starts.get(0));
                result.ends.add(this.ends.get(0));
                this.starts.remove(0);
                this.ends.remove(0);
            } else {
                result.starts.add(interval.starts.get(0));
                result.ends.add(interval.ends.get(0));
                interval.starts.remove(0);
                interval.ends.remove(0);
            }
        }
        return result;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for(int i = 0; i < starts.size();i++){
            sb.append(starts.get(i));
            sb.append("-");
            sb.append(ends.get(i));
            if(i<starts.size()-1) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    public static void main(String... args) {
        Interval i = new Interval(1, 2);
        Interval j = new Interval(4, 5);
        Interval k = new Interval(7, 9);

        System.out.println(i.union(j).union(k));
    }
}

输出:     [1-2,4-5,7-9]