Android中正确安全删除集合中的元素
16lz
2021-01-23
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 4.0用户界面设计和元素-ICS简介
- Android - 主要的UI元素。
- Android ListActivity实现遍历文件列表,查看文档类文件
- Android ListView下滑会报空指针异常
- Appium Android 元素定位方法 原生+H5
- Android 平台上,界面元素在定时器的响应函数里刷新。
- Android遍历某个文件夹的图片并实现滑动查看的的Gallery
- android 遍历安装过的包名