使用环境:
无意间使用了一个增强for循环,遍历知己之后判断另一个数组中是否包含,如果包含就删除使用了增强for循环的那个列表
for(String p : phones){ if (p.contains(res)) { phones.remove(p); Log.e("log","包含同样数据的是==》"+ p); } Log.e("log","不包含同样数据的是==》"+ p); }这样做结果ConcurrentModificationException
根据网上前辈的资料:http://blog.csdn.net/aaawqqq/article/details/43884623
讲的是因为你遍历了自己,然后通过判断删除自己,导致了这个报错。
解决的方法是
将需要遍历的那个数组赋值给另一个同类型的数组,然后遍历那个数组,之后将遍历过的数组在赋值给原来的数组。
思路很简单,但是需要知道是为什么。
Listps = phones; for(String p : ps){ if (p.contains(res)) { phones.remove(p); Log.e("log","包含同样数据的是==》"+ p); } Log.e("log","不包含同样数据的是==》"+ p); }
但是还有一个问题,如果字符串过长,而且字符串毕竟只有0--9这几个,如果包含就删除,一次性讲究全部删除完了。
所以,上面的代码在特定情况下就是扯淡!很扯淡!
如果需要删除的话,就需要唯一性! 就是你要删除的那个字串所有 的元素包括标点都是其他item里没有的,才可以使用上面的方法。
所以,如果需要走上面的思路,需要做一些更精准的考虑:
if (res.length() == 10) { Listps = phones; for (String p : ps) { String str = p.substring(p.length() - 1, p.length()); p = p.substring(0, p.length() - 1); if (p.equals(res)) { phones.remove(p + str); Log.e("log", "包含同样数据的是==》" + p + str); } else { Log.e("log", "不包含同样数据的是==》" + p + str); } } }else{ Log.e("log","小于10位"); }
这样判断,意思是如果字符串的长度 == 10 ,就将需要遍历的数组A 赋值给B,然后将B遍历。
我的字符串就是电话号码,所以一旦开始删除,十一位的号码就剩下十位了。
而B数组中的号码还是11位,对号码进行截取前十位,对比判断,如果包含就删除。
如果字符串低于10位,就不做判断 。
到这明白一个事情,就是为什么会抱这个错,因为我在判断数组B中的元素是否包含字符串res的时候,数组B就是数组A中有多个元素都是包含,所以判断一次,删除了很多。
这样是不合理的,因为我想要的就是只删除一次。而且是精准删除!
如果电话号码前十位都是相同的 ,那么,这一删可是删掉了全部!
而且,项目会直接崩掉。
当然,谁会没事输入两个前十位号码都一样的手机号码,然后点删除输入框里 的数据?这几率很低,但是还存在。
所以用了一个很不要脸的方法,当输入框里输入的电话号码超过十位就是十一位的时候,让整个输入框失去焦点。
如果用户还需要输入的活着做修改,那就点击删除再输入一次。这样,如果还能错了我就真不知道怎么搞。
关于这个报错有什么不明白的,请联系我 QQ 532245792