package org.codemap.kdtree; // Bjoern Heckel's solution to the KD-Tree n-nearest-neighbor problem class NearestNeighborList<T> { static class NeighborEntry<T> implements Comparable<NeighborEntry<T>> { final T data; final double value; public NeighborEntry(final T data, final double value) { this.data = data; this.value = value; } public int compareTo(NeighborEntry<T> t) { // note that the positions are reversed! return Double.compare(t.value, this.value); } }; java.util.PriorityQueue<NeighborEntry<T>> m_Queue; int m_Capacity = 0; // constructor public NearestNeighborList(int capacity) { m_Capacity = capacity; m_Queue = new java.util.PriorityQueue<NeighborEntry<T>>(m_Capacity); } public double getMaxPriority() { NeighborEntry p = m_Queue.peek(); return (p == null) ? Double.POSITIVE_INFINITY : p.value ; } public boolean insert(T object, double priority) { if (isCapacityReached()) { if (priority > getMaxPriority()) { // do not insert - all elements in queue have lower priority return false; } m_Queue.add(new NeighborEntry<T>(object, priority)); // remove object with highest priority m_Queue.poll(); } else { m_Queue.add(new NeighborEntry<T>(object, priority)); } return true; } public boolean isCapacityReached() { return m_Queue.size()>=m_Capacity; } public T getHighest() { NeighborEntry<T> p = m_Queue.peek(); return (p == null) ? null : p.data ; } public boolean isEmpty() { return m_Queue.size()==0; } public int getSize() { return m_Queue.size(); } public T removeHighest() { // remove object with highest priority NeighborEntry<T> p = m_Queue.poll(); return (p == null) ? null : p.data ; } }