SparseArray迭代&在Android中删除

时间:2015-02-07 02:38:37

标签: java android

我试图从队列中获取结果,然后处理它并将其删除。但是在访问null键的情况下我得到了Java异常,见下文

int key = 0;
int size = mQueue.size();
for (int i = 0; i< size; i++) {
    key = mQueue.keyAt(i);
    result = mQueue.get(key);
    // process(result);
    mQueue.remove(result.id);
}

>>From Queue-->{  
1=Result[id=1,type-1,data],  
5=Result[id=5,type=40,data2],  
6=Result[id=6,type=2,data3]}

>>From Loop-->  
i=1, key=1  
i=2, key=6<--- was expecting key= 5  
i=3, key=6<--- JE here, since mQueue.get(6) =null because removed from i=2

有什么不对吗?

3 个答案:

答案 0 :(得分:1)

当你在循环中调用mQueue.remove时,你正在改变mQueue的大小,这会让事情变得混乱。

如果您使用了ArrayList或HashMap,则可以使用迭代器并使用iterator.remove()从集合中删除next返回的最后一个对象。

或者,如果您确实需要使用SparseArray,则可以记录要删除的对象,并在新循环中执行删除操作。

int key = 0;
int size = mQueue.size();

// Assuming your result.id field is an Integer
ArrayList<Integer> forRemoval = new ArrayList();

for (int i = 0; i< size; i++) {
    key = mQueue.keyAt(i);
    result = mQueue.get(key);
    forRemoval.add(result.id);
}

for (int i = 0; i < forRemoval.size; i++) {
    mQueue.remove(forRemoval.get(i));
}

答案 1 :(得分:1)

处理mQueue时,请勿从Result移除。只需标记要删除的索引,并在循环结束后删除它们。关键是在迭代它时不要让SparseArray索引发生变化。

int key = 0;
int size = mQueue.size();
List<Integer> toRemove = new ArrayList<Integer>();

for (int i = 0; i< size; i++) {
    key = mQueue.keyAt(i);
    result = mQueue.get(key);
    // process(result);
    toRemove.add(result.id);
}

for (Integer id: toRemove) {
    mQueue.remove(result.id);
}

答案 2 :(得分:1)

你可以向后迭代

for (int i = mQueue.size() - 1; i >= 0; i--) {
        int key = mQueue.keyAt(i);
        Object result = mQueue.get(key);
        process(result);
        mQueue.remove(key);
}