1 package de.lathanda.eos.base.util;
3 import java.util.Collection;
4 import java.util.LinkedList;
6 import java.util.SortedSet;
7 import java.util.TreeSet;
23 public class IntervalTree<T
extends Interval & Comparable<T> > {
30 public void insert(T t) {
42 public List<T> seek(
double value) {
43 LinkedList<T> intervals =
new LinkedList<>();
47 seek(root, value, intervals);
56 public void seek(
double value, Collection<T> intervals) {
58 seek(root, value, intervals);
66 public List<T> seek(T t) {
67 LinkedList<T> intervals =
new LinkedList<>();
71 seek(root, t, intervals);
80 public void seek(T t, Collection<T> intervals) {
82 seek(root, t, intervals);
91 private static <T extends Interval & Comparable<T> >
void seek(Node<T> start,
double value, Collection<T> intervals) {
92 LinkedList<Node<T> > queue =
new LinkedList<>();
95 while (!queue.isEmpty()) {
97 if (value < work.value) {
98 work.addLow(value, intervals);
99 if (work.lower !=
null) {
100 queue.addFirst(work.lower);
102 }
else if (value > work.value) {
103 work.addHigh(value, intervals);
104 if (work.higher !=
null) {
105 queue.addFirst(work.higher);
108 work.addAll(intervals);
118 private static <T extends Interval & Comparable<T> >
void seek(Node<T> start, T t, Collection<T> intervals) {
119 LinkedList<Node<T> > queue =
new LinkedList<>();
122 while (!queue.isEmpty()) {
124 if (t.getHigh() < work.value) {
125 work.addLow(t.getHigh(), intervals);
126 if (work.lower !=
null) {
127 queue.addFirst(work.lower);
129 }
else if (t.getLow() > work.value) {
130 work.addHigh(t.getLow(), intervals);
131 if (work.higher !=
null) {
132 queue.addFirst(work.higher);
135 work.addAll(intervals);
136 if (work.higher !=
null) {
137 queue.addFirst(work.higher);
139 if (work.lower !=
null) {
140 queue.addFirst(work.lower);
151 private static <T extends Interval & Comparable<T> >
void insert(Node<T> start, T t) {
154 switch (t.locate(act.value)) {
156 if (act.higher ==
null) {
157 act.higher =
new Node<T>(t);
164 if (act.lower ==
null) {
165 act.lower =
new Node<T>(t.getCenter());
184 private static class Node<T
extends Interval & Comparable<T> > {
186 private final double value;
188 private final SortedSet<T> lowOrder;
190 private final SortedSet<T> highOrder;
192 private Node<T> lower;
194 private Node<T> higher;
199 private Node(
double value) {
201 lowOrder =
new TreeSet<T>(
new Interval.LowAscComparator<>());
202 highOrder =
new TreeSet<T>(
new Interval.HighDescComparator<>());
209 this.value = t.getCenter();
210 lowOrder =
new TreeSet<T>(
new Interval.LowAscComparator<>());
211 highOrder =
new TreeSet<T>(
new Interval.HighDescComparator<>());
218 private void add(T t) {
228 private void addHigh(
double value, Collection<T> list) {
229 for(T t: highOrder) {
230 if (t.getHigh() >= value) {
243 private void addLow(
double value, Collection<T> list) {
245 if (t.getLow() <= value) {
256 public void addAll(Collection<T> list) {
257 list.addAll(lowOrder);