How to iterate through SparseArray?

后端 未结 10 1746
野的像风
野的像风 2020-11-30 18:16

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.

10条回答
  •  长情又很酷
    2020-11-30 18:45

    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)) {
      // ...
    }
    

提交回复
热议问题