PointQuadTree extends QuadTree<Vector3, V> { @Override public List<Vector3> getKeys() { final List<Vector3> arr = new ArrayList<Vector3>(); this.traverse(this.root, new Func<V>() { @Override public void call(PointQuadTree<V> quadTree, Node<V> node) { arr.add(((PointData<V>) node.getData()).getPoint()); } }); return arr; } PointQuadTree(float minX, float minZ, float maxX, float maxZ);  PointQuadTree(Vector3 startPoint,Vector3 endPoint); @SuppressWarnings({ "unchecked", "rawtypes" }) @Override void set(Vector3 k, V v); @Override V get(Vector3 k, V defaultValue); @Override Node<V> find(Node<V> node, Vector3 vector3); @Override V remove(Vector3 k); @SuppressWarnings("unchecked") @Override List<PointData<V>> getKeyValues(); @Override List<Vector3> getKeys(); @Override List<V> getValues(); void traverse(Node<V> node, Func<V> func); List<PointData<V>> searchIntersect(final double xmin, final double ymin, final double xmax,
			final double ymax); List<PointData<V>> searchWithin(final float xmin, final float zmin, final float xmax, final float zmax); List<PointData<V>> searchWithin(Vector3 point, float radius); PointQuadTree<V> clone();  }
@Test public void testGetKeys() { List<Vector3> list = getTree().getKeys(); Collections.sort(list, (o1, o2) -> (int) (o1.getX() - o2.getX())); System.out.println(list.toString()); List<PointData<String>> keyValues = getTree().getKeyValues(); System.err.println(keyValues); }