Android中正确安全删除集合中的元素
16lz
2022-08-04
Android中使用集合那是家常便饭的事情来的,但是有的时候容易麻痹大意,比如在删除集合元素的过程,我就掉进过坑里,在此总结下来,以后引以为戒。
1. 删除一个集合元素
List 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 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 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 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());
删除成功
更多相关文章
- Android(安卓)流式布局FlowLayout(搜索历史),多布局、删除、添加
- Android(安卓)通讯录中用到的关于按名字首字母排序方法
- android studio的问题整理(如何删除模块(Module))
- android studio的问题整理
- android SQLiteDatebase 实践
- gson使用在android使用例子
- Android动态添加删除recycleview并动态保存recycleview中的的数
- Android(安卓)问题集合
- Android(安卓)监控应用删除,并提示处理