黑马程序员技术交流社区
标题:
ArrayList集合去除重复元素的问题
[打印本页]
作者:
刘海东
时间:
2013-6-3 10:19
标题:
ArrayList集合去除重复元素的问题
本帖最后由 刘海东 于 2013-6-3 20:49 编辑
/*
*将自定义对象作为元素
*并取出相同元素,重复元素
*如:存储人对象
*同姓名同年龄视为同一个人,为同一元素
*思路:
*1、对人进行描述,将数据封装进人对象
*2、定义容器,将人存入
*3、取出*/
package cn.itcast.day14;
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListTest2 {
public static void main(String[] args) {
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("lisi01", 21));
al.add(new Person("lisi02", 22));
al.add(new Person("lisi02", 22));
ArrayList<Person> al2 = singleElements(al);// 调用这个方法之后,本应该去除重复元素
for (Iterator<Person> it = al2.iterator(); it.hasNext();) {
Person temp = it.next();
System.out.println(temp.getName() + "..." + temp.getAge());// 迭代器:打印元素
}
}
public static ArrayList<Person> singleElements(ArrayList<Person> al) {
ArrayList<Person> newAl = new ArrayList<Person>(); // 这个方法 作用是 去除重复元素
for (Iterator<Person> it = al.iterator(); it.hasNext();) {
Person p = it.next();
if (!newAl.contains(p)) {//这个contians()方法不是应该调用Person类中重写之后的equals方法吗?
newAl.add(p);
}
}
return newAl;
}
}
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(Person p) {
System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}
}
这里我是直接用myEclipse 写的。写好之后运行发现不能去除重复元素
然后我换用cmd,编译可以通过,运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么?
作者:
chensc
时间:
2013-6-3 10:42
学习学习!
作者:
胡晓思
时间:
2013-6-3 10:47
编译可以通过,运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么 ?
建议楼主查看一下 .java 的文件名 是否和 public class @@ 这里的class名是一致的
作者:
赵乐
时间:
2013-6-3 10:50
问题出在这
public boolean equals(Person p) {
System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}
}
你这个方法没有复写equals方法
这个是正确的
public boolean equals(Object obj)
//类型必须是Object 类型
{
if(!(obj instanceof Person))
//判断person是不是obj引用的实例,不是直接结束
return false;
Person p = (Person)obj;
//然后强转为person类型
System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}
作者:
胡晓思
时间:
2013-6-3 10:52
应该调用的是容器的比较器吧
作者:
First
时间:
2013-6-3 11:30
楼主只要把你的equals稍微改一下就OK
改成这样的:
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(!(obj instanceof Person))
return false;
else{
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
复制代码
关于: 运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么?
肯定是因为你javac的文件有包,但是 你的java 却没有包
就是你编译的文件有Packge,运行时也要求有包名
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2