Is there a way to iterate over Java SparseArray (for Android) ? I used sparsearray to easily get values by index. I could not find one.
Here is simple Iterator and Iterable implementations for SparseArray:
public class SparseArrayIterator implements Iterator {
private final SparseArray array;
private int index;
public SparseArrayIterator(SparseArray array) {
this.array = array;
}
@Override
public boolean hasNext() {
return array.size() > index;
}
@Override
public T next() {
return array.valueAt(index++);
}
@Override
public void remove() {
array.removeAt(index);
}
}
public class SparseArrayIterable implements Iterable {
private final SparseArray sparseArray;
public SparseArrayIterable(SparseArray sparseArray) {
this.sparseArray = sparseArray;
}
@Override
public Iterator iterator() {
return new SparseArrayIterator<>(sparseArray);
}
}
If you want to iterate not only a value but also a key:
public class SparseKeyValue {
private final int key;
private final T value;
public SparseKeyValue(int key, T value) {
this.key = key;
this.value = value;
}
public int getKey() {
return key;
}
public T getValue() {
return value;
}
}
public class SparseArrayKeyValueIterator implements Iterator> {
private final SparseArray array;
private int index;
public SparseArrayKeyValueIterator(SparseArray array) {
this.array = array;
}
@Override
public boolean hasNext() {
return array.size() > index;
}
@Override
public SparseKeyValue next() {
SparseKeyValue keyValue = new SparseKeyValue<>(array.keyAt(index), array.valueAt(index));
index++;
return keyValue;
}
@Override
public void remove() {
array.removeAt(index);
}
}
public class SparseArrayKeyValueIterable implements Iterable> {
private final SparseArray sparseArray;
public SparseArrayKeyValueIterable(SparseArray sparseArray) {
this.sparseArray = sparseArray;
}
@Override
public Iterator> iterator() {
return new SparseArrayKeyValueIterator(sparseArray);
}
}
It's useful to create utility methods that return Iterable and Iterable:
public abstract class SparseArrayUtils {
public static Iterable> keyValueIterable(SparseArray sparseArray) {
return new SparseArrayKeyValueIterable<>(sparseArray);
}
public static Iterable iterable(SparseArray sparseArray) {
return new SparseArrayIterable<>(sparseArray);
}
}
Now you can iterate SparseArray:
SparseArray a = ...;
for (String s: SparseArrayUtils.iterable(a)) {
// ...
}
for (SparseKeyValue s: SparseArrayUtils.keyValueIterable(a)) {
// ...
}