Collections.sort(intervals, comparator);
boolean overlap = true;
while (overlap) {
overlap = false;
for (int i = 0; i < intervals.size() - 1; i++) {
Interval interval = intervals.get(i);
Interval next = intervals.get(i + 1);
if (interval.getLow() == next.getLow()) {
intervals.set(i + 1, createInterval(dynamicType, interval.getHigh(), next.getHigh(), true,
next.isHighExcluded(), next.getValue()));
overlap = true;
break;
}
if (interval.getHigh() == next.getHigh()) {
intervals.set(i, createInterval(dynamicType, interval.getLow(), next.getLow(),
interval.isLowExcluded(), true, interval.getValue()));
overlap = true;
break;
}
if (next.getLow() < interval.getLow() && next.getHigh() > interval.getHigh()) {
intervals.set(i + 1, createInterval(dynamicType, interval.getHigh(), next.getHigh(), true,
next.isHighExcluded(), interval.getValue()));
overlap = true;
break;
}
if ((next.getLow() < interval.getHigh() || (next.getLow() == interval.getHigh()
&& !interval.isHighExcluded())) && next.getHigh() < interval.getHigh()) {
intervals.set(i, createInterval(dynamicType, interval.getLow(), next.getLow(),
interval.isLowExcluded(), true, interval.getValue()));
intervals.add(i + 2, createInterval(dynamicType, next.getHigh(), interval.getHigh(), true,
interval.isHighExcluded(), interval.getValue()));
overlap = true;
break;
}
if (next.getLow() == interval.getHigh() && !interval.isHighExcluded() && !next.isLowExcluded()) {
intervals.set(i, createInterval(dynamicType, interval.getLow(), interval.getHigh(),
interval.isLowExcluded(), true, interval.getValue()));
overlap = true;
break;
}
if (next.getLow() < interval.getHigh()) {
intervals.set(i, createInterval(dynamicType, interval.getLow(), next.getHigh(),
interval.isLowExcluded(), true, interval.getValue()));
overlap = true;
break;
}
}