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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙峰 黑马帝   /  2012-6-25 13:30  /  2483 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙峰 于 2012-6-25 16:00 编辑
  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub

  3. ArrayList<String> aList=new ArrayList<String>();
  4. aList.add("edae"); aList.add("ee" );
  5. aList.add("abc"); aList.add("efj3os");
  6. aList.add("abc" ); aList.add("ab1c");
  7. aList.add("efjdsdos");

  8. System.out.println("原集合中成员:"+aList);

  9. getNewList(aList);

  10. System.out.println("查询后的集合:"+aList);

  11. }

  12. public static void getNewList(ArrayList<String> aList)
  13. {

  14. Iterator it=aList.listIterator();
  15. while(it.hasNext())
  16. {
  17. Object obj=(Object)it.next();
  18. if(obj.equals("abc"))
  19. aList.remove(obj);
  20. }
  21. }




  22. }
复制代码
将集合中的“abc”删除了,这个遍历出问题,麻烦给解释下,  我开始用增强for 也有点老绕不出来, 求大侠把用增强 for 的也给我写下,谢谢

7 个回复

倒序浏览
public static void getNewList(ArrayList<String> aList)
{

              Iterator it=aList.listIterator();
              while(it.hasNext())
             {
                    Object obj=(Object)it.next();
                   if(obj.equals("abc"))
                  aList.remove(obj);//应该改成it.remove();在迭代时不可以通过集合中的对象操作集合中的元素              }
}




回复 使用道具 举报
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
回复 使用道具 举报
李伟 发表于 2012-6-25 14:16
public static void getNewList(ArrayList aList)
{

谢谢,如果我用增强for 的话,这样应该怎么写呢
        public static ArrayList getNewList(ArrayList<String> aList)
        {
                for(String str:aList)
                {
                        if(str.equals("abc"))
                        {
                                aList.remove(str);
                                continue;
                        }
                        else
                                return aList;
                }
                return null;
        }
        传入原集合,然后这个方法返回修改后的集合,这里应该怎么写?
回复 使用道具 举报
  1.   import java.util.*;
  2.    public class ArrayListTest
  3.    {
  4.         public static void main(String[] args) {
  5.     // TODO Auto-generated method stub

  6.     ArrayList<String> aList=new ArrayList<String>();
  7.     aList.add("edae"); aList.add("ee" );
  8.     aList.add("abc"); aList.add("efj3os");
  9.     aList.add("abc" ); aList.add("ab1c");
  10.     aList.add("efjdsdos");

  11.     System.out.println("原集合中成员:"+aList);

  12.    // getNewList(aList);

  13.     System.out.println("查询后的集合:"+getNewList(aList));

  14.     }

  15.     public static ArrayList getNewList(ArrayList<String> aList)
  16.     {
  17.       /*
  18.                 ArrayList newAl = new ArrayList();

  19.                 Iterator it = aList.iterator();

  20.                 while(it.hasNext())
  21.                 {
  22.                         Object obj = it.next();

  23.                         if(!newAl.contains(obj))
  24.                                 newAl.add(obj);

  25.                 }

  26.                 return newAl;*/
  27.                
  28.                 ArrayList newAl = new ArrayList();

  29.          for(Iterator it2 = aList.iterator();it2.hasNext();)
  30.                 {
  31.                  Object obj = it2.next();
  32.                  if(!newAl.contains(obj))
  33.                  newAl.add(obj);}

  34.           
  35.                 return newAl;
  36.    }
  37.     }

  38.    

  39.    
复制代码
回复 使用道具 举报
孙峰 发表于 2012-6-25 15:20
谢谢,如果我用增强for 的话,这样应该怎么写呢
        public static ArrayList getNewList(ArrayList aList)
...

public static ArrayList<String> getNewList(ArrayList<String> aList)
{
         ArrayList<String> newAl=new ArrayList<String>();//用来存放不包含"abc"的字符串
         for(String str:aList)
         {
                if(!(str.equals("abc")))
                {
                         newAl.add(str);//添加不包含"abc"的字符串
                }
         }
         return newAl;
}
回复 使用道具 举报
李伟 中级黑马 2012-6-25 16:08:01
7#
aList.remove("abc");只是能删除aList列表中首次出现的"abc".
回复 使用道具 举报
李伟 中级黑马 2012-6-25 16:09:53
8#
public static ArrayList<String> getNewList(ArrayList<String> aList)
{
         ArrayList<String> newAl=new ArrayList<String>();//用来存放不包含"abc"的字符串
         for(String str:aList)
         {
                if(!(str.equals("abc")))
                {
                         newAl.add(str);//添加不是"abc"的字符串
                }
         }
         return newAl;
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马