Nếu bạn sử dụng Kotlin, bạn có thể sử dụng các chức năng mở rộng như vậy, ví dụ:
fun <T> LongSparseArray<T>.valuesIterator(): Iterator<T> {
val nSize = this.size()
return object : Iterator<T> {
var i = 0
override fun hasNext(): Boolean = i < nSize
override fun next(): T = valueAt(i++)
}
}
fun <T> LongSparseArray<T>.keysIterator(): Iterator<Long> {
val nSize = this.size()
return object : Iterator<Long> {
var i = 0
override fun hasNext(): Boolean = i < nSize
override fun next(): Long = keyAt(i++)
}
}
fun <T> LongSparseArray<T>.entriesIterator(): Iterator<Pair<Long, T>> {
val nSize = this.size()
return object : Iterator<Pair<Long, T>> {
var i = 0
override fun hasNext(): Boolean = i < nSize
override fun next() = Pair(keyAt(i), valueAt(i++))
}
}
Bạn cũng có thể chuyển đổi thành một danh sách, nếu bạn muốn. Thí dụ:
sparseArray.keysIterator().asSequence().toList()
Tôi nghĩ rằng nó thậm chí có thể được an toàn đến các mục delete sử dụng remove
trên LongSparseArray
bản thân (không phải trên iterator), vì nó là thứ tự tăng dần.
EDIT: Có vẻ như có một cách dễ dàng hơn, bằng cách sử dụng bộ sưu tập-ktx (ví dụ ở đây ). Nó được thực hiện theo cách rất giống với những gì tôi đã viết, thực tế.
Lớp yêu cầu này:
implementation 'androidx.core:core-ktx:#'
implementation 'androidx.collection:collection-ktx:#'
Đây là cách sử dụng cho LongSparseArray:
val sparse= LongSparseArray<String>()
for (key in sparse.keyIterator()) {
}
for (value in sparse.valueIterator()) {
}
sparse.forEach { key, value ->
}
Và đối với những người sử dụng Java, bạn có thể sử dụng LongSparseArrayKt.keyIterator
, LongSparseArrayKt.valueIterator
và LongSparseArrayKt.forEach
, ví dụ. Tương tự cho các trường hợp khác.