2
2
3
3
import java .security .InvalidParameterException ;
4
4
import java .util .ArrayList ;
5
+ import java .util .Collections ;
5
6
import java .util .Comparator ;
6
7
import java .util .Iterator ;
7
8
import java .util .List ;
12
13
* An interval tree is an ordered tree data structure to hold intervals.
13
14
* Specifically, it allows one to efficiently find all intervals that overlap
14
15
* with any given interval or point.
15
- *
16
- * Note: This class does not handle intervals with the same start and end points.
17
- *
16
+ *
18
17
* http://en.wikipedia.org/wiki/Interval_tree
19
18
*
20
19
* @author Justin Wetherell <phishman3579@gmail.com>
@@ -35,12 +34,6 @@ public int compare(IntervalData<?> arg0, IntervalData<?> arg1) {
35
34
return -1 ;
36
35
if (arg1 .start < arg0 .start )
37
36
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
44
37
return 0 ;
45
38
}
46
39
};
@@ -56,13 +49,7 @@ public int compare(IntervalData<?> arg0, IntervalData<?> arg1) {
56
49
if (arg0 .end < arg1 .end )
57
50
return -1 ;
58
51
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 ;
66
53
return 0 ;
67
54
}
68
55
};
@@ -85,7 +72,7 @@ protected static final <O extends Object> Interval<O> createFromList(List<Interv
85
72
if (intervals .size ()==1 ) {
86
73
IntervalData <O > middle = intervals .get (0 );
87
74
newInterval .center = ((middle .start + middle .end ) / 2 );
88
- newInterval .overlap . add (middle );
75
+ newInterval .add (middle );
89
76
} else {
90
77
int half = intervals .size () / 2 ;
91
78
IntervalData <O > middle = intervals .get (half );
@@ -98,7 +85,7 @@ protected static final <O extends Object> Interval<O> createFromList(List<Interv
98
85
} else if (interval .start > newInterval .center ) {
99
86
rightIntervals .add (interval );
100
87
} else {
101
- newInterval .overlap . add (interval );
88
+ newInterval .add (interval );
102
89
}
103
90
}
104
91
if (leftIntervals .size () > 0 )
@@ -179,7 +166,12 @@ public static final class Interval<O> {
179
166
private long center = Long .MIN_VALUE ;
180
167
private Interval <O > left = null ;
181
168
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
+ }
183
175
184
176
/**
185
177
* Stabbing query
@@ -204,7 +196,8 @@ else if (temp != null)
204
196
}
205
197
} else if (index >= center ) {
206
198
// 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 );
208
201
overlapEnd .addAll (overlap );
209
202
for (IntervalData <O > data : overlapEnd ) {
210
203
if (data .end < index )
0 commit comments