Skip to content

Commit fd3f489

Browse files
author
Justin Wetherell
committed
Clean up of the query based tree's and their tests
1 parent 623b81f commit fd3f489

File tree

6 files changed

+627
-368
lines changed

6 files changed

+627
-368
lines changed

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

+43-54
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.jwetherell.algorithms.data_structures;
22

3-
import java.security.InvalidParameterException;
43
import java.util.ArrayList;
54
import java.util.Collection;
65
import java.util.Collections;
76
import java.util.Comparator;
87
import java.util.HashSet;
9-
import java.util.Iterator;
108
import java.util.List;
119
import java.util.Set;
1210

@@ -23,8 +21,7 @@ public class IntervalTree<O extends Object> {
2321

2422
private Interval<O> root = null;
2523

26-
private static final Comparator<IntervalData<?>> startComparator = new Comparator<IntervalData<?>>() {
27-
24+
private static final Comparator<IntervalData<?>> START_COMPARATOR = new Comparator<IntervalData<?>>() {
2825
/**
2926
* {@inheritDoc}
3027
*/
@@ -39,8 +36,7 @@ public int compare(IntervalData<?> arg0, IntervalData<?> arg1) {
3936
}
4037
};
4138

42-
private static final Comparator<IntervalData<?>> endComparator = new Comparator<IntervalData<?>>() {
43-
39+
private static final Comparator<IntervalData<?>> END_COMPARATOR = new Comparator<IntervalData<?>>() {
4440
/**
4541
* {@inheritDoc}
4642
*/
@@ -74,26 +70,29 @@ protected static final <O extends Object> Interval<O> createFromList(List<Interv
7470
IntervalData<O> middle = intervals.get(0);
7571
newInterval.center = ((middle.start + middle.end) / 2);
7672
newInterval.add(middle);
77-
} else {
78-
int half = intervals.size() / 2;
79-
IntervalData<O> middle = intervals.get(half);
80-
newInterval.center = ((middle.start + middle.end) / 2);
81-
List<IntervalData<O>> leftIntervals = new ArrayList<IntervalData<O>>();
82-
List<IntervalData<O>> rightIntervals = new ArrayList<IntervalData<O>>();
83-
for (IntervalData<O> interval : intervals) {
84-
if (interval.end < newInterval.center) {
85-
leftIntervals.add(interval);
86-
} else if (interval.start > newInterval.center) {
87-
rightIntervals.add(interval);
88-
} else {
89-
newInterval.add(interval);
90-
}
91-
}
92-
if (leftIntervals.size() > 0)
93-
newInterval.left = createFromList(leftIntervals);
94-
if (rightIntervals.size() > 0)
95-
newInterval.right = createFromList(rightIntervals);
73+
return newInterval;
74+
}
75+
76+
int half = intervals.size() / 2;
77+
IntervalData<O> middle = intervals.get(half);
78+
newInterval.center = ((middle.start + middle.end) / 2);
79+
List<IntervalData<O>> leftIntervals = new ArrayList<IntervalData<O>>();
80+
List<IntervalData<O>> rightIntervals = new ArrayList<IntervalData<O>>();
81+
for (IntervalData<O> interval : intervals) {
82+
if (interval.end < newInterval.center) {
83+
leftIntervals.add(interval);
84+
} else if (interval.start > newInterval.center) {
85+
rightIntervals.add(interval);
86+
} else {
87+
newInterval.add(interval);
88+
}
9689
}
90+
91+
if (leftIntervals.size() > 0)
92+
newInterval.left = createFromList(leftIntervals);
93+
if (rightIntervals.size() > 0)
94+
newInterval.right = createFromList(rightIntervals);
95+
9796
return newInterval;
9897
}
9998

@@ -181,7 +180,7 @@ public IntervalData<O> query(long index) {
181180
IntervalData<O> results = null;
182181
if (index < center) {
183182
// overlap is sorted by start point
184-
Collections.sort(overlap,startComparator);
183+
Collections.sort(overlap,START_COMPARATOR);
185184
for (IntervalData<O> data : overlap) {
186185
if (data.start > index)
187186
break;
@@ -194,7 +193,7 @@ else if (results != null && temp != null)
194193
}
195194
} else if (index >= center) {
196195
// overlap is reverse sorted by end point
197-
Collections.sort(overlap,endComparator);
196+
Collections.sort(overlap,END_COMPARATOR);
198197
for (IntervalData<O> data : overlap) {
199198
if (data.end < index)
200199
break;
@@ -206,6 +205,7 @@ else if (results != null && temp != null)
206205
results.combined(temp);
207206
}
208207
}
208+
209209
if (index < center) {
210210
if (left != null) {
211211
IntervalData<O> temp = left.query(index);
@@ -246,20 +246,23 @@ public IntervalData<O> query(long start, long end) {
246246
else if (results != null && temp != null)
247247
results.combined(temp);
248248
}
249+
249250
if (left != null && start < center) {
250251
IntervalData<O> temp = left.query(start, end);
251252
if (temp != null && results == null)
252253
results = temp;
253254
else if (results != null && temp != null)
254255
results.combined(temp);
255256
}
257+
256258
if (right != null && end >= center) {
257259
IntervalData<O> temp = right.query(start, end);
258260
if (temp != null && results == null)
259261
results = temp;
260262
else if (results != null && temp != null)
261263
results.combined(temp);
262264
}
265+
263266
return results;
264267
}
265268

@@ -278,7 +281,7 @@ public String toString() {
278281
/**
279282
* Data structure representing an interval.
280283
*/
281-
public static final class IntervalData<O> implements Comparable<IntervalData<O>> {
284+
public static class IntervalData<O> implements Comparable<IntervalData<O>> {
282285

283286
private long start = Long.MIN_VALUE;
284287
private long end = Long.MAX_VALUE;
@@ -318,17 +321,6 @@ public IntervalData(long start, long end, Set<O> set) {
318321
this.start = start;
319322
this.end = end;
320323
this.set = set;
321-
322-
// Make sure they are unique
323-
Iterator<O> iter = set.iterator();
324-
while (iter.hasNext()) {
325-
O obj1 = iter.next();
326-
O obj2 = null;
327-
if (iter.hasNext())
328-
obj2 = iter.next();
329-
if (obj1.equals(obj2))
330-
throw new InvalidParameterException("Each interval data in the list must be unique.");
331-
}
332324
}
333325

334326
/**
@@ -389,9 +381,9 @@ public IntervalData<O> combined(IntervalData<O> data) {
389381
* @return deep copy.
390382
*/
391383
public IntervalData<O> copy() {
392-
Set<O> listCopy = new HashSet<O>();
393-
listCopy.addAll(set);
394-
return new IntervalData<O>(start, end, listCopy);
384+
Set<O> copy = new HashSet<O>();
385+
copy.addAll(set);
386+
return new IntervalData<O>(start, end, copy);
395387
}
396388

397389
/**
@@ -404,12 +396,10 @@ public IntervalData<O> copy() {
404396
* @return Data queried for or NULL if it doesn't match the query.
405397
*/
406398
public IntervalData<O> query(long index) {
407-
if (index < this.start || index > this.end) {
408-
// Ignore
409-
} else {
410-
return copy();
411-
}
412-
return null;
399+
if (index < this.start || index > this.end)
400+
return null;
401+
402+
return copy();
413403
}
414404

415405
/**
@@ -422,12 +412,10 @@ public IntervalData<O> query(long index) {
422412
* @return Data queried for or NULL if it doesn't match the query.
423413
*/
424414
public IntervalData<O> query(long startOfQuery, long endOfQuery) {
425-
if (endOfQuery < this.start || startOfQuery > this.end) {
426-
// Ignore
427-
} else {
428-
return copy();
429-
}
430-
return null;
415+
if (endOfQuery < this.start || startOfQuery > this.end)
416+
return null;
417+
418+
return copy();
431419
}
432420

433421
/**
@@ -446,6 +434,7 @@ public int hashCode() {
446434
public boolean equals(Object obj) {
447435
if (!(obj instanceof IntervalData))
448436
return false;
437+
449438
IntervalData<O> data = (IntervalData<O>) obj;
450439
if (this.start == data.start && this.end == data.end) {
451440
if (this.set.size() != data.set.size())

0 commit comments

Comments
 (0)