黑马程序员技术交流社区

标题: 【已解决】关于泛型的问题 [打印本页]

作者: 孔肖    时间: 2012-9-2 10:34
标题: 【已解决】关于泛型的问题
本帖最后由 孔肖 于 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;
}
作者: 王德升    时间: 2012-9-2 10:41
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:44
本帖最后由 孙沛 于 2012-9-2 10:46 编辑

it.next()返回的是一个object类型,必须要定义的,你可以定义为Person对象类型,也可以定义为Object对象类型
所以可以是Person p = it.next();,也可以是Object ob = it.next();
作者: 王金科    时间: 2012-9-2 12:58
  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() ,就是判断是否还有下一个元素
作者: AngieFans85    时间: 2012-9-3 08:23
你的问题很简单:
if(!newList.contains(it.next()))                     
                    newList.add(it.next());

打个比方,假如你的it里只有一个元素,第一次调用it.next()方法返回一个元素(但是你没有用一个Person引用来指向这个返回的元素),然后再调用一次it.next()方法,就会再返回下一个元素,但是你的it中就一个元素,那么第二次调用it.next()方法就无法找到元素,所以就会报NoSuchElementException异常.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2