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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔肖 中级黑马   /  2012-9-2 10:34  /  1956 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孔肖 于 2012-9-4 17:51 编辑

在Arraylist去除重复元素的时候,定义一个方法
private static List<Person> singleElement(List<Person> list)
{
         List<Person> newList = new ArrayList<Person>();
  
         Iterator<Person> it = list.iterator();
  
         while(it.hasNext())
        {
             //Person p = it.next();

             //  将上一句注释掉,这里直接用 it.next() 时,会发生 NoSuchElementException ,这是为什呢?不是已经用泛型明确了集合中存储的就是Person对象了吗?
             if(!newList.contains(it.next()))                     
                    newList.add(it.next());
        }
      
      return newList;
}

4 个回复

倒序浏览
private static List<Person> singleElement(List<Person> list)
{
          List<Person> newList = new ArrayList<Person>();
   
          Iterator<Person> it = list.iterator();
   
          while(it.hasNext())
         {
              //Person p = it.next();

             //  因为next()  返回的是迭代的下一个元素。你只有写出来才会返回元素,并且这个元素是Person类型的,所以用Person接收,
              if(!newList.contains(it.next()))    //你这句也调用了it.next()编译是报错的,               
                     newList.add(it.next());
         }
      
       return newList;
}
回复 使用道具 举报
本帖最后由 孙沛 于 2012-9-2 10:46 编辑

it.next()返回的是一个object类型,必须要定义的,你可以定义为Person对象类型,也可以定义为Object对象类型
所以可以是Person p = it.next();,也可以是Object ob = it.next();
回复 使用道具 举报
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;


  4. public class Test{
  5.         public static void main(String[] args){
  6.                 List<Integer> list = new ArrayList<Integer>();
  7.                 list.add(1);
  8.                 list.add(2);
  9.                 list.add(3);
  10.                 list.add(5);
  11.                
  12.                 Iterator<Integer> it = list.iterator();
  13.                 int i = 0;
  14.                 while(it.hasNext()){
  15.                         i++;
  16.                         System.out.println(it.next());
  17.                         System.out.println(it.next());
  18.                         System.out.println(it.next());
  19.                         System.out.println(it.next());
  20.                         //System.out.println(it.next()); //这里不注释掉,就会抛出java.util.NoSuchElementException异常
  21.                 }
  22.                 System.out.println(i);
  23.         }
  24. }
复制代码
你的情况就相当于上面这个代码,出现这个问题不是泛型引起的,而是没有元素了.
it.next();返回下一个元素,你在代码里多次使用了it.next();每调用一次it.next();就返回下一个值

在我的这段演示代码中,list里的元素都取出来了,而 i 最终的值是1,说明只循环了一次.更证明it.next();每次都是取列表中的下一个元素
如果没有下一个元素了,就跑java.util.NoSuchElementException异常了

while里的 it.hasNext() ,就是判断是否还有下一个元素
回复 使用道具 举报
你的问题很简单:
if(!newList.contains(it.next()))                     
                    newList.add(it.next());

打个比方,假如你的it里只有一个元素,第一次调用it.next()方法返回一个元素(但是你没有用一个Person引用来指向这个返回的元素),然后再调用一次it.next()方法,就会再返回下一个元素,但是你的it中就一个元素,那么第二次调用it.next()方法就无法找到元素,所以就会报NoSuchElementException异常.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马