EOS 2  1.1.0
Einfache Objektbasierte Sprache
IntervalTree.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.base.util;
2 
3 import java.util.Collection;
4 import java.util.LinkedList;
5 import java.util.List;
6 import java.util.SortedSet;
7 import java.util.TreeSet;
23 public class IntervalTree<T extends Interval & Comparable<T> > {
25  private Node<T> root;
30  public void insert(T t) {
31  if (root == null) {
32  root = new Node<>(t);
33  } else {
34  insert(root, t);
35  }
36  }
42  public List<T> seek(double value) {
43  LinkedList<T> intervals = new LinkedList<>();
44  if (root == null) {
45  return intervals;
46  } else {
47  seek(root, value, intervals);
48  return intervals;
49  }
50  }
56  public void seek(double value, Collection<T> intervals) {
57  if (root != null) {
58  seek(root, value, intervals);
59  }
60  }
66  public List<T> seek(T t) {
67  LinkedList<T> intervals = new LinkedList<>();
68  if (root == null) {
69  return intervals;
70  } else {
71  seek(root, t, intervals);
72  return intervals;
73  }
74  }
80  public void seek(T t, Collection<T> intervals) {
81  if (root != null) {
82  seek(root, t, intervals);
83  }
84  }
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<>();
93  Node<T> work = null;
94  queue.add(start);
95  while (!queue.isEmpty()) {
96  work = queue.pop();
97  if (value < work.value) {
98  work.addLow(value, intervals);
99  if (work.lower != null) {
100  queue.addFirst(work.lower);
101  }
102  } else if (value > work.value) {
103  work.addHigh(value, intervals);
104  if (work.higher != null) {
105  queue.addFirst(work.higher);
106  }
107  } else {
108  work.addAll(intervals);
109  }
110  }
111  }
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<>();
120  Node<T> work = null;
121  queue.add(start);
122  while (!queue.isEmpty()) {
123  work = queue.pop();
124  if (t.getHigh() < work.value) {
125  work.addLow(t.getHigh(), intervals);
126  if (work.lower != null) {
127  queue.addFirst(work.lower);
128  }
129  } else if (t.getLow() > work.value) {
130  work.addHigh(t.getLow(), intervals);
131  if (work.higher != null) {
132  queue.addFirst(work.higher);
133  }
134  } else {
135  work.addAll(intervals);
136  if (work.higher != null) {
137  queue.addFirst(work.higher);
138  }
139  if (work.lower != null) {
140  queue.addFirst(work.lower);
141  }
142 
143  }
144  }
145  }
151  private static <T extends Interval & Comparable<T> >void insert(Node<T> start, T t) {
152  Node<T> act = start;
153  while (true) {
154  switch (t.locate(act.value)) {
155  case LOWER:
156  if (act.higher == null) {
157  act.higher = new Node<T>(t);
158  return;
159  } else {
160  act = act.higher;
161  }
162  break;
163  case HIGHER:
164  if (act.lower == null) {
165  act.lower = new Node<T>(t.getCenter());
166  act.lower.add(t);
167  return;
168  } else {
169  act = act.lower;
170  }
171  break;
172  case BETWEEN:
173  act.add(t);
174  return;
175  }
176  }
177  }
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) {
200  this.value = value;
201  lowOrder = new TreeSet<T>(new Interval.LowAscComparator<>());
202  highOrder = new TreeSet<T>(new Interval.HighDescComparator<>());
203  }
208  private Node(T t) {
209  this.value = t.getCenter();
210  lowOrder = new TreeSet<T>(new Interval.LowAscComparator<>());
211  highOrder = new TreeSet<T>(new Interval.HighDescComparator<>());
212  add(t);
213  }
218  private void add(T t) {
219  lowOrder.add(t);
220  highOrder.add(t);
221  }
228  private void addHigh(double value, Collection<T> list) {
229  for(T t: highOrder) {
230  if (t.getHigh() >= value) {
231  list.add(t);
232  } else {
233  break;
234  }
235  }
236  }
243  private void addLow(double value, Collection<T> list) {
244  for(T t: lowOrder) {
245  if (t.getLow() <= value) {
246  list.add(t);
247  } else {
248  break;
249  }
250  }
251  }
256  public void addAll(Collection<T> list) {
257  list.addAll(lowOrder);
258  }
259  }
260 }
Impressum