package org.emdev.utils.collections; import android.util.SparseArray; import java.util.Iterator; import java.util.NoSuchElementException; public class SparseArrayEx<T> extends SparseArray<T> implements Iterable<T> { private final ThreadLocal<SparseArrayIterator> iterators = new ThreadLocal<SparseArrayEx<T>.SparseArrayIterator>(); public boolean isEmpty() { return size() == 0; } @Override public TLIterator<T> iterator() { SparseArrayIterator iter = iterators.get(); if (iter == null) { iter = new SparseArrayIterator(); return iter; } iter.remaining = size(); iter.removalIndex = -1; iterators.set(null); return iter; } private class SparseArrayIterator implements TLIterator<T> { /** Number of elements remaining in this iteration */ private int remaining = size(); /** Index of element that remove() would remove, or -1 if no such elt */ private int removalIndex = -1; private SparseArrayIterator() { } @Override public boolean hasNext() { return remaining > 0; } @Override public T next() { if (remaining <= 0) { throw new NoSuchElementException(); } removalIndex = size() - remaining; remaining--; return valueAt(removalIndex); } @Override public void remove() { if (removalIndex < 0) { throw new IllegalStateException(); } SparseArrayEx.this.remove(keyAt(removalIndex)); removalIndex = -1; } @Override public Iterator<T> iterator() { return this; } @Override public void release() { iterators.set(this); } } }