BAEL-7513 Merge overlapping intervals in collection
This commit is contained in:
parent
bac8dd0536
commit
d7527a382e
|
@ -0,0 +1,37 @@
|
||||||
|
package com.baeldung.algorithms.mergeintervals;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class Interval {
|
||||||
|
int start;
|
||||||
|
int end;
|
||||||
|
|
||||||
|
Interval(int start, int end) {
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnd(int end) {
|
||||||
|
this.end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Interval{" + "start=" + start + ", end=" + end + '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o)
|
||||||
|
return true;
|
||||||
|
if (o == null || getClass() != o.getClass())
|
||||||
|
return false;
|
||||||
|
Interval interval = (Interval) o;
|
||||||
|
return start == interval.start && end == interval.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(start, end);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.baeldung.algorithms.mergeintervals;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MergeOverlappingIntervals {
|
||||||
|
|
||||||
|
public List<Interval> doMerge(List<Interval> intervals) {
|
||||||
|
// Sort the intervals based on start time
|
||||||
|
intervals.sort((one, two) -> one.start - two.start);
|
||||||
|
|
||||||
|
// Create somewhere to put the merged list, start it off with the earliest starting interval
|
||||||
|
ArrayList<Interval> merged = new ArrayList<>();
|
||||||
|
merged.add(intervals.get(0));
|
||||||
|
|
||||||
|
// Loop over each interval and merge if start time is before the end time of the
|
||||||
|
// previous interval
|
||||||
|
intervals.forEach(interval -> {
|
||||||
|
if (merged.get(merged.size() - 1).end > interval.start) {
|
||||||
|
merged.get(merged.size() - 1).setEnd(interval.end);
|
||||||
|
} else {
|
||||||
|
merged.add(interval);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return merged;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.baeldung.algorithms.mergeintervals;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class MergeIntervalsUnitTest {
|
||||||
|
|
||||||
|
private ArrayList<Interval> intervals = new ArrayList<>(Arrays.asList(
|
||||||
|
new Interval(2, 5),
|
||||||
|
new Interval(13, 20),
|
||||||
|
new Interval(11, 15),
|
||||||
|
new Interval(1, 3)
|
||||||
|
));
|
||||||
|
private ArrayList<Interval> intervalsMerged = new ArrayList<>(Arrays.asList(
|
||||||
|
new Interval(1, 5),
|
||||||
|
new Interval(11, 20)
|
||||||
|
));
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenIntervals_whenMerging_thenReturnMergedIntervals() {
|
||||||
|
MergeOverlappingIntervals merger = new MergeOverlappingIntervals();
|
||||||
|
ArrayList<Interval> result = (ArrayList<Interval>) merger.doMerge(intervals);
|
||||||
|
assertArrayEquals(intervalsMerged.toArray(), result.toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue