
umcg.genetica.collections.intervaltree.IntervalTree Maven / Gradle / Ivy
package umcg.genetica.collections.intervaltree;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
*
* @author Patrick Deelen
*/
public class IntervalTree {
private final IntervalTreeNode rootNode;
private final int size;
private final Class classE;
public IntervalTree(final E[] elements, Class classE) {
//This does not make a copy of the array.
this(Arrays.asList(elements), classE);
}
public IntervalTree(final List elements, Class classE) {
for (E e : elements) {
if (e.getStart() > e.getEnd()) {
throw new IllegalArgumentException("Start is greater than end. This is not allowed in the interval tree.");
}
}
this.classE = classE;
rootNode = createNode(elements);
size = elements.size();
}
public ArrayList getElementsOverlappingQuery(final int query) {
final ArrayList results = new ArrayList();
rootNode.queryNode(results, query);
return results;
}
;
private IntervalTreeNode createNode(final List elements) {
final ArrayList left = new ArrayList();
final ArrayList right = new ArrayList();
final ArrayList center = new ArrayList();
final E centerElement = elements.get(elements.size()/2);
final int centerPoint = centerElement.getStart();
// System.out.println("--------");
// System.out.println("Elements " + elements.size());
// System.out.println("Center point " + centerPoint);
for (E element : elements) {
if (element.getEnd() < centerPoint) {
left.add(element);
} else if (element.getStart() > centerPoint) {
right.add(element);
} else {
center.add(element);
}
}
// System.out.println("Left size " + left.size());
// System.out.println("Right size " + right.size());
// System.out.println("Center size " + center.size());
// System.out.println("--------");
final IntervalTreeNode leftNode = left.isEmpty() ? null : createNode(left);
final IntervalTreeNode rightNode = right.isEmpty() ? null : createNode(right);
//We copy ArrayList of center into array since we will have many nodes and need this list twice
//Due to different sorting
@SuppressWarnings("unchecked")
E[] centerArray = (E[]) Array.newInstance(classE, center.size());
return new IntervalTreeNode(centerPoint, leftNode, rightNode, center.toArray(centerArray));
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy