黑马程序员技术交流社区
标题:
请大家看看为什么出错
[打印本页]
作者:
doyxy
时间:
2014-1-13 11:04
标题:
请大家看看为什么出错
本帖最后由 doyxy 于 2014-1-13 14:02 编辑
arraylist的练习,看着和毕老师的代码没什么区别,为什么运行会报错呢?
Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:834)
at ArrayListTest2.getSingle(ArrayListTest2.java:69)
at ArrayListTest2.main(ArrayListTest2.java:50)
/*
list集合中判断元素是否相同,使用的是元素的equals方法
*/
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public boolean equals(Object obj)
{
if (!(obj instanceof Person))//判断类型
return false;
Person p = (Person)obj;//转型
return this.name.equals(p.name) && this.age == p.age;//重写判断方法.
}
}
class ArrayListTest2
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add(new Person("lisi01",23));
al.add(new Person("lisi02",25));
al.add(new Person("lisi02",23));
al.add(new Person("lisi03",32));
al.add(new Person("lisi04",33));
al.add(new Person("lisi04",33));
al.add(new Person("lisi05",20));
al = getSingle(al);
Iterator it = al.iterator();
while (it.hasNext())
{
Person p = (Person)it.next();//多态问题,需要向下转型.
sop(p.getName()+"..."+p.getAge());
}
}
public static ArrayList getSingle(ArrayList al)
{
ArrayList alnew = new ArrayList();
//使用迭代器
Iterator it = al.iterator();
//历遍
while (it.hasNext())
{
if (!alnew.contains(it.next()))
alnew.add(it.next());
}
return alnew;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
复制代码
作者:
几番意难相付
时间:
2014-1-13 11:34
第68行
if (!alnew.contains(it.next()))
alnew.add(it.next());
首要你要明白迭代的原理
假设要迭代一个存储了3个元素的集合
迭代有一个指针
调用 it.next() 指针指向集合的0号角标
再调用一次 it.next() 指针指向集合的1号角标
所以在以上两句代码中
if (!alnew.contains(it.next())) 判断的假如是在集合中0角标的位置
alnew.add(it.next());添加的并不是if语句中所判断的那个所在0角标位置的元素
而是1角标位置的元素
这样当迭代到集合的最后一个元素时 如果继续调用it.next 就超过了集合中元素的个数 类似于数组角标越界
这个异常也就是集合的“数组角标越界异常”
建议将it.next元素先存储到一个变量中 然后对这个变量进行判断和添加到另一个集合中
像这样
while (it.hasNext())
{
Person p=(Person) it.next();
if (!alnew.contains(p))
alnew.add(p);
}
复制代码
作者:
doyxy
时间:
2014-1-13 14:01
原来如此,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2