[fix-merging-overlapping] fix

This commit is contained in:
Kai.Yuan 2024-04-10 21:59:56 +02:00
parent 28bb26ceb2
commit 2a8e5bb69d
2 changed files with 28 additions and 22 deletions

View File

@ -1,23 +1,22 @@
package com.baeldung.algorithms.mergeintervals; package com.baeldung.algorithms.mergeintervals;
import static java.lang.Integer.max;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class MergeOverlappingIntervals { public class MergeOverlappingIntervals {
public List<Interval> doMerge(List<Interval> intervals) { public List<Interval> doMerge(List<Interval> intervals) {
// Sort the intervals based on start time intervals.sort(Comparator.comparingInt(interval -> interval.start));
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<>(); ArrayList<Interval> merged = new ArrayList<>();
merged.add(intervals.get(0)); 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 -> { intervals.forEach(interval -> {
if (merged.get(merged.size() - 1).end > interval.start) { Interval lastMerged = merged.get(merged.size() - 1);
merged.get(merged.size() - 1).setEnd(interval.end); if (interval.start <= lastMerged.end){
lastMerged.setEnd(max(interval.end, lastMerged.end));
} else { } else {
merged.add(interval); merged.add(interval);
} }
@ -25,5 +24,4 @@ public class MergeOverlappingIntervals {
return merged; return merged;
} }
}
}

View File

@ -1,30 +1,38 @@
package com.baeldung.algorithms.mergeintervals; package com.baeldung.algorithms.mergeintervals;
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
class MergeIntervalsUnitTest { class MergeIntervalsUnitTest {
private ArrayList<Interval> intervals = new ArrayList<>(Arrays.asList( private List<Interval> intervals = new ArrayList<>(Arrays.asList(
new Interval(2, 5), // @formatter:off
new Interval(13, 20), new Interval(3, 5),
new Interval(11, 15), new Interval(13, 20),
new Interval(1, 3) new Interval(11, 15),
new Interval(15, 16),
new Interval(1, 3),
new Interval(4, 5),
new Interval(16, 17)
// @formatter:on
)); ));
private ArrayList<Interval> intervalsMerged = new ArrayList<>(Arrays.asList( private List<Interval> intervalsMerged = new ArrayList<>(Arrays.asList(
new Interval(1, 5), // @formatter:off
new Interval(11, 20) new Interval(1, 5),
new Interval(11, 20)
// @formatter:on
)); ));
@Test @Test
void givenIntervals_whenMerging_thenReturnMergedIntervals() { void givenIntervals_whenMerging_thenReturnMergedIntervals() {
MergeOverlappingIntervals merger = new MergeOverlappingIntervals(); MergeOverlappingIntervals merger = new MergeOverlappingIntervals();
ArrayList<Interval> result = (ArrayList<Interval>) merger.doMerge(intervals); List<Interval> result = merger.doMerge(intervals);
assertArrayEquals(intervalsMerged.toArray(), result.toArray()); assertEquals(intervalsMerged, result);
} }
} }