A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔丽阁 中级黑马   /  2014-4-8 22:21  /  1071 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 下面这个代码为什么第一个for循环报错。
复制代码




9 个回复

倒序浏览
代码呢?????????????:L
回复 使用道具 举报
public static void main(String[] args) {
                List<String> list = new ArrayList<String>();
                list.add("aa");
                list.add("bb");
                list.add("cc");
                list.add("dd");
                list.add("ee");
                int i=0;
               
                for(String str:list){
                        if(str.equals("bb"))
                                list.remove(str);
                }
                System.out.println(list);
               
                /*while(i<list.size()){
                        if(list.get(i).equals("bb"))
                                list.remove(i);
                        else
                                i++;
                }*/
        }
代码不知道怎么没显示,这个是代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
孔丽阁 发表于 2014-4-8 22:23
public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aa");

不太明白你想干什么?
是要去掉list里面的bb字符串吗?
为什么不用迭代器?

  1. for(Iterator it = list.iterator();it.hasNext();){
  2.                     if(it.next().equals("bb")){
  3.                             it.remove();
  4.                     }
  5.             }
复制代码


你的代码有异常当然不行。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
linweiwen 发表于 2014-4-8 22:38
不太明白你想干什么?
是要去掉list里面的bb字符串吗?
为什么不用迭代器?

是要去掉里边的bb字符串,我想测试的是iterator接口为什么不能像下边那个循环一样,因为下边那个循环就不报错
回复 使用道具 举报
是这个报这个错误吧!
Exception in thread "main" java.util.ConcurrentModificationException

这个异常是当方法检测到对象的并发修改,但不允许这种修改时,抛出的!

因为你在用高级 For 遍历集合的时候修改集合中的元素了,是不可以的!
使用迭代器遍历时,也不可以修改集合中的元素 !

可以重新看一下 毕老师讲的 集合,温习一下!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
楼主你的错误就是楼上那个原因,
另外要么全用迭代器的方法要么全用集合的方法,
但迭代器只有删除方法,刚好符合你的要求。
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-4-8 23:09 编辑

楼主,高级For循环是不能在遍历中修改ArrayList集合中的元素的,因此,它才自己定义了一个ListIterator。
如果你将
for(String str:list){
        if(str.equals("bb"))
        list.remove(str);
}
修改为:
for(String str:list){
        System.out.println(str);
}
就不会报错了,因为没有涉及到增删操作。当然,这只是验证。

当然如果你要删除集合中所有的“bb”,我这儿还有你没提出来的两种方法。
方法1:定义一个ListIterator迭代器,遍历集合,并进行删除操作。
ListIterator it = list.ListIterator
for(Iterator it = list.iterator();it.hasNext();)
{
     if(it.next().equals("bb"))
     {
            it.remove();
     }
}

方法2:在定义一个集合list2,并存入“bb”,然后利用list集合的removeAll方法求两个集合的差集即可(注意:如果list中有多个"bb",那么这种方法也是可行的)。
List<String> list2 = new ArrayList<String>();
list2.add("bb");
list.removeAll(list2); //求list与list2的差集,并将结果存入list集合中。

方法2也是一种思路,希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
增强性for循环改为普通for循环:
int i=0;
               
                for(String str:list){
                        if(str.equals("bb"))
                                list.remove(str);
                }
                System.out.println(list);
改为:
for(int i=0;i<list.size();i++){
                String str=list.get(i);
                if(str.equals("bb"))
                {        
                        list.remove(str);
                        i--;
                }
        }
回复 使用道具 举报
增强for循环在遍历集合中元素时时不能对其进行修改的,你可以把它改为一般的for循环,
  1. for(int i=0;i<list.size();i++){
  2.     String str=list.get(i);
  3.     if(str.equals("bb"))
  4.     {        
  5.             list.remove(str);           
  6.     }else{
  7.             i++;
  8.     }
  9. }
复制代码

或者用迭代器进行遍历,然后用迭代器的remove方法进行删除操作。
  1. Iterator<String> iterator = list.iterator();
  2.                 while(iterator.hasNext()){
  3.                         if("bb".equals(iterator.next())){
  4.                                 iterator.remove();
  5.                         }
  6.                                
  7.                 }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马