Android中使用集合那是家常便饭的事情来的,但是有的时候容易麻痹大意,比如在删除集合元素的过程,我就掉进过坑里,在此总结下来,以后引以为戒。
1. 删除一个集合元素
List<Integer> lists = new ArrayList<>();
lists.add(1);
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
lists.add(6);
lists.add(7);
lists.add(8);
lists.add(9);
for (int i = 0; i < lists.size(); i++) {
int num = lists.get(i);
if (num == 6) {
lists.remove(i);
break;
}
}
LeoLog.ee("剩下的集合:" + lists.toString());
打出的log:
删除成功。
如果用下面这个方法会有一个需要注意的地方。
for (int num : lists) {
if (num == 6) {
lists.remove((Object) num);
//注意:不加break,会报ConcurrentModificationException
break;
}
}
2. 删除多个集合元素
这种是有风险的
List<Integer> lists = new ArrayList<>();
lists.add(1);
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
lists.add(6);
lists.add(7);
lists.add(8);
lists.add(9);
for (int i = 0; i < lists.size(); i++) {
int num = lists.get(i);
if (num == 4)
lists.remove(i);
if (num == 5)
lists.remove(i);
if (num == 6)
lists.remove(i);
}
LeoLog.ee("剩下的集合:" + lists.toString());
打出的log
发现,我条件要求删除的是4、5、6,但是5没有被移除,发生的原因就是,当4被移除了,然后5的索引就会发生变化。
当然有一种方式可以这样
for (int i = 0; i < lists.size(); i++) {
int num = lists.get(i);
if (num == 4) {
lists.remove(i);
//每删一次就重新遍历
i = 0;
}
if (num == 5)
{
lists.remove(i);
//每删一次就重新遍历
i = 0;
}
if (num == 6)
{
lists.remove(i);
//每删一次就重新遍历
i = 0;
}
}
但是我感觉最好的方式还是使用iterator(迭代器)
List<Integer> lists = new ArrayList<>();
lists.add(1);
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
lists.add(6);
lists.add(7);
lists.add(8);
lists.add(9);
Iterator<Integer> iterator = lists.iterator();
while (iterator.hasNext()) {
int pos = iterator.next();
if (pos == 4) {
iterator.remove();
}
if (pos == 5) {
iterator.remove();
}
if (pos == 6) {
iterator.remove();
}
}
LeoLog.ee("剩下的集合:" + lists.toString());
删除成功