How to iterate through SparseArray?

后端 未结 10 1726
野的像风
野的像风 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:54

    If you use Kotlin, you can use extension functions as such, for example:

    fun  LongSparseArray.valuesIterator(): Iterator {
        val nSize = this.size()
        return object : Iterator {
            var i = 0
            override fun hasNext(): Boolean = i < nSize
            override fun next(): T = valueAt(i++)
        }
    }
    
    fun  LongSparseArray.keysIterator(): Iterator {
        val nSize = this.size()
        return object : Iterator {
            var i = 0
            override fun hasNext(): Boolean = i < nSize
            override fun next(): Long = keyAt(i++)
        }
    }
    
    fun  LongSparseArray.entriesIterator(): Iterator> {
        val nSize = this.size()
        return object : Iterator> {
            var i = 0
            override fun hasNext(): Boolean = i < nSize
            override fun next() = Pair(keyAt(i), valueAt(i++))
        }
    }
    

    You can also convert to a list, if you wish. Example:

    sparseArray.keysIterator().asSequence().toList()
    

    I think it might even be safe to delete items using remove on the LongSparseArray itself (not on the iterator), as it is in ascending order.


    EDIT: Seems there is even an easier way, by using collection-ktx (example here) . It's implemented in a very similar way to what I wrote, actally.

    Gradle requires this:

    implementation 'androidx.core:core-ktx:#'
    implementation 'androidx.collection:collection-ktx:#'
    

    Here's the usage for LongSparseArray :

        val sparse= LongSparseArray()
        for (key in sparse.keyIterator()) {
        }
        for (value in sparse.valueIterator()) {
        }
        sparse.forEach { key, value -> 
        }
    

    And for those that use Java, you can use LongSparseArrayKt.keyIterator , LongSparseArrayKt.valueIterator and LongSparseArrayKt.forEach , for example. Same for the other cases.

提交回复
热议问题