是否有一种方法来迭代Java SparseArray (Android) ?我使用sparsearray很容易地按索引获取值。我找不到一个。
当前回答
如果你使用Kotlin,你可以像这样使用扩展函数,例如:
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++))
}
}
如果您愿意,还可以将其转换为列表。例子:
sparseArray.keysIterator().asSequence().toList()
我认为在LongSparseArray本身(而不是在迭代器上)上使用remove删除项可能是安全的,因为它是升序的。
编辑:似乎有一种更简单的方法,使用collection-ktx(示例)。实际上,它的实现方式与我写的非常相似。
Gradle要求:
implementation 'androidx.core:core-ktx:#'
implementation 'androidx.collection:collection-ktx:#'
下面是LongSparseArray的用法:
val sparse= LongSparseArray<String>()
for (key in sparse.keyIterator()) {
}
for (value in sparse.valueIterator()) {
}
sparse.forEach { key, value ->
}
对于那些使用Java的人,您可以使用LongSparseArrayKt。keyIterator, LongSparseArrayKt。valueIterator和LongSparseArrayKt。例如,对每个人。其他情况也一样。
其他回答
使用上述循环从SparseArray中删除所有元素会导致Exception。
为了避免这种情况,按照下面的代码使用普通循环从SparseArray中删除所有元素
private void getValues(){
for(int i=0; i<sparseArray.size(); i++){
int key = sparseArray.keyAt(i);
Log.d("Element at "+key, " is "+sparseArray.get(key));
sparseArray.remove(key);
i=-1;
}
}
答案是否定的,因为SparseArray没有提供。正如pst所说,这个东西不提供任何接口。
您可以从0 - size()开始循环,并跳过返回null的值,但仅此而已。
正如我在我的评论中所述,如果你需要迭代使用Map而不是SparseArray。例如,使用按键顺序迭代的TreeMap。
TreeMap<Integer, MyType>
如果你使用Kotlin,你可以像这样使用扩展函数,例如:
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++))
}
}
如果您愿意,还可以将其转换为列表。例子:
sparseArray.keysIterator().asSequence().toList()
我认为在LongSparseArray本身(而不是在迭代器上)上使用remove删除项可能是安全的,因为它是升序的。
编辑:似乎有一种更简单的方法,使用collection-ktx(示例)。实际上,它的实现方式与我写的非常相似。
Gradle要求:
implementation 'androidx.core:core-ktx:#'
implementation 'androidx.collection:collection-ktx:#'
下面是LongSparseArray的用法:
val sparse= LongSparseArray<String>()
for (key in sparse.keyIterator()) {
}
for (value in sparse.valueIterator()) {
}
sparse.forEach { key, value ->
}
对于那些使用Java的人,您可以使用LongSparseArrayKt。keyIterator, LongSparseArrayKt。valueIterator和LongSparseArrayKt。例如,对每个人。其他情况也一样。
对于使用Kotlin的人来说,老实说,到目前为止迭代SparseArray最简单的方法是:使用Anko或Android KTX的Kotlin扩展!(感谢Yazazzello指出Android KTX)
简单地调用forEach {i, item ->}
看来我找到解决办法了。我没有正确地注意到keyAt(index)函数。
所以我会这样说:
for(int i = 0; i < sparseArray.size(); i++) {
int key = sparseArray.keyAt(i);
// get the object by the key.
Object obj = sparseArray.get(key);
}
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 碎片中的onCreateOptionsMenu
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?