是否有一种方法来迭代Java SparseArray (Android) ?我使用sparsearray很容易地按索引获取值。我找不到一个。
当前回答
对于使用Kotlin的人来说,老实说,到目前为止迭代SparseArray最简单的方法是:使用Anko或Android KTX的Kotlin扩展!(感谢Yazazzello指出Android KTX)
简单地调用forEach {i, item ->}
其他回答
公认的答案有一些漏洞。SparseArray的美妙之处在于它允许在折痕处有空隙。我们可以有两个地图,在SparseArray中。
(0,true)
(250,true)
注意这里的大小是2。如果我们遍历大小,我们将只得到映射到索引0和索引1的值。因此不能访问键值为250的映射。
for(int i = 0; i < sparseArray.size(); i++) {
int key = sparseArray.keyAt(i);
// get the object by the key.
Object obj = sparseArray.get(key);
}
最好的方法是遍历数据集的大小,然后在数组上使用get()检查这些索引。这里有一个适配器的例子,我允许批量删除项目。
for (int index = 0; index < mAdapter.getItemCount(); index++) {
if (toDelete.get(index) == true) {
long idOfItemToDelete = (allItems.get(index).getId());
mDbManager.markItemForDeletion(idOfItemToDelete);
}
}
我认为理想情况下SparseArray家族应该有一个getKeys()方法,但可惜它没有。
使用上述循环从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>
看来我找到解决办法了。我没有正确地注意到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);
}
这里是SparseArray<T>的简单Iterator<T>和Iterable<T>实现:
public class SparseArrayIterator<T> implements Iterator<T> {
private final SparseArray<T> array;
private int index;
public SparseArrayIterator(SparseArray<T> 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<T> implements Iterable<T> {
private final SparseArray<T> sparseArray;
public SparseArrayIterable(SparseArray<T> sparseArray) {
this.sparseArray = sparseArray;
}
@Override
public Iterator<T> iterator() {
return new SparseArrayIterator<>(sparseArray);
}
}
如果你不仅要迭代一个值,还要迭代一个键:
public class SparseKeyValue<T> {
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<T> implements Iterator<SparseKeyValue<T>> {
private final SparseArray<T> array;
private int index;
public SparseArrayKeyValueIterator(SparseArray<T> array) {
this.array = array;
}
@Override
public boolean hasNext() {
return array.size() > index;
}
@Override
public SparseKeyValue<T> next() {
SparseKeyValue<T> keyValue = new SparseKeyValue<>(array.keyAt(index), array.valueAt(index));
index++;
return keyValue;
}
@Override
public void remove() {
array.removeAt(index);
}
}
public class SparseArrayKeyValueIterable<T> implements Iterable<SparseKeyValue<T>> {
private final SparseArray<T> sparseArray;
public SparseArrayKeyValueIterable(SparseArray<T> sparseArray) {
this.sparseArray = sparseArray;
}
@Override
public Iterator<SparseKeyValue<T>> iterator() {
return new SparseArrayKeyValueIterator<T>(sparseArray);
}
}
创建返回Iterable<T>和Iterable<SparseKeyValue<T>>的实用程序方法很有用:
public abstract class SparseArrayUtils {
public static <T> Iterable<SparseKeyValue<T>> keyValueIterable(SparseArray<T> sparseArray) {
return new SparseArrayKeyValueIterable<>(sparseArray);
}
public static <T> Iterable<T> iterable(SparseArray<T> sparseArray) {
return new SparseArrayIterable<>(sparseArray);
}
}
现在你可以迭代SparseArray<T>:
SparseArray<String> a = ...;
for (String s: SparseArrayUtils.iterable(a)) {
// ...
}
for (SparseKeyValue<String> s: SparseArrayUtils.keyValueIterable(a)) {
// ...
}
推荐文章
- 警告: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++ ?