All Downloads are FREE. Search and download functionalities are using the official Maven repository.

umcg.genetica.collections.intervaltree.IntervalTree Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
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