Skip to content

Commit 83d4346

Browse files
author
phishman3579
committed
Added ability to have duplicate intervals
git-svn-id: https://java-algorithms-implementation.googlecode.com/svn/trunk@441 032fbc0f-8cab-eb90-e552-f08422b9a96a
1 parent c069a3d commit 83d4346

File tree

1 file changed

+13
-20
lines changed

1 file changed

+13
-20
lines changed

src/com/jwetherell/algorithms/data_structures/IntervalTree.java

+13-20
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.security.InvalidParameterException;
44
import java.util.ArrayList;
5+
import java.util.Collections;
56
import java.util.Comparator;
67
import java.util.Iterator;
78
import java.util.List;
@@ -12,9 +13,7 @@
1213
* An interval tree is an ordered tree data structure to hold intervals.
1314
* Specifically, it allows one to efficiently find all intervals that overlap
1415
* with any given interval or point.
15-
*
16-
* Note: This class does not handle intervals with the same start and end points.
17-
*
16+
*
1817
* http://en.wikipedia.org/wiki/Interval_tree
1918
*
2019
* @author Justin Wetherell <phishman3579@gmail.com>
@@ -35,12 +34,6 @@ public int compare(IntervalData<?> arg0, IntervalData<?> arg1) {
3534
return -1;
3635
if (arg1.start < arg0.start)
3736
return 1;
38-
// Then end
39-
if (arg0.end < arg1.end)
40-
return -1;
41-
if (arg1.end < arg0.end)
42-
return 1;
43-
// if they have the same start and end they must be equal
4437
return 0;
4538
}
4639
};
@@ -56,13 +49,7 @@ public int compare(IntervalData<?> arg0, IntervalData<?> arg1) {
5649
if (arg0.end < arg1.end)
5750
return -1;
5851
if (arg1.end < arg0.end)
59-
return 1;
60-
// Then start
61-
if (arg0.start < arg1.start)
62-
return -1;
63-
if (arg1.start < arg0.start)
64-
return 1;
65-
// if they have the same start and end they must be equal
52+
return 1;
6653
return 0;
6754
}
6855
};
@@ -85,7 +72,7 @@ protected static final <O extends Object> Interval<O> createFromList(List<Interv
8572
if (intervals.size()==1) {
8673
IntervalData<O> middle = intervals.get(0);
8774
newInterval.center = ((middle.start + middle.end) / 2);
88-
newInterval.overlap.add(middle);
75+
newInterval.add(middle);
8976
} else {
9077
int half = intervals.size() / 2;
9178
IntervalData<O> middle = intervals.get(half);
@@ -98,7 +85,7 @@ protected static final <O extends Object> Interval<O> createFromList(List<Interv
9885
} else if (interval.start > newInterval.center) {
9986
rightIntervals.add(interval);
10087
} else {
101-
newInterval.overlap.add(interval);
88+
newInterval.add(interval);
10289
}
10390
}
10491
if (leftIntervals.size() > 0)
@@ -179,7 +166,12 @@ public static final class Interval<O> {
179166
private long center = Long.MIN_VALUE;
180167
private Interval<O> left = null;
181168
private Interval<O> right = null;
182-
private Set<IntervalData<O>> overlap = new TreeSet<IntervalData<O>>(startComparator);
169+
private List<IntervalData<O>> overlap = new ArrayList<IntervalData<O>>(); // startComparator
170+
171+
private void add(IntervalData<O> data) {
172+
overlap.add(data);
173+
Collections.sort(overlap,startComparator);
174+
}
183175

184176
/**
185177
* Stabbing query
@@ -204,7 +196,8 @@ else if (temp != null)
204196
}
205197
} else if (index >= center) {
206198
// overlapEnd is sorted by end point
207-
Set<IntervalData<O>> overlapEnd = new TreeSet<IntervalData<O>>(endComparator);
199+
List<IntervalData<O>> overlapEnd = new ArrayList<IntervalData<O>>();
200+
Collections.sort(overlapEnd,endComparator);
208201
overlapEnd.addAll(overlap);
209202
for (IntervalData<O> data : overlapEnd) {
210203
if (data.end < index)

0 commit comments

Comments
 (0)