所以我有一个对象列表,这些对象是间隔,例如[2-10]。左端始终小于右端(开始<结束)。
现在说我计算间隔的并集, 像[2-9]和[10-12],我想将[2-9,10-12]作为单个对象返回。
仅使用间隔对象列表,有什么方法可以返回该间隔实例吗?
此外,非数字字符是从我的toString方法构建的,不要被混淆为对象本身的一部分。
答案 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]