黑马程序员技术交流社区
标题:
ArrayList 集合去除重复元素
[打印本页]
作者:
wangkerui
时间:
2014-4-13 11:53
标题:
ArrayList 集合去除重复元素
本帖最后由 wangkerui 于 2014-4-13 18:24 编辑
例:将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*;
class Person
{
private int age;
private String name;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj) // equals 方法是用来比较的,下面的singleElement 也是用来比较的,它们都在比较什,这个小程序运行的顺序是什么?
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class Test
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
ArrayList a = new ArrayList();
a.add(new Person("lisi01",21));
a.add(new Person("lisi02",22));
a.add(new Person("lisi03",23));
a.add(new Person("lisi03",23));
a.add(new Person("lisi04",24));
a.add(new Person("lisi05",24));
a = singleElement(a);
Iterator i = a.iterator();
while(i.hasNext())
{
Person p =(Person)i.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static ArrayList singleElement(ArrayList a)
{
ArrayList A = new ArrayList();
Iterator i = a.iterator();
while(i.hasNext())
{
Object obj = i.next();
if(!A.contains(obj))
A.add(obj);
}
return A;
}
}
复制代码
问题: equals 方法在比较什么? singleElement 方法在比较什么?为什么两个方法都存在了程序才能正常运行?这个小程序的执行顺序是怎么样的?
作者:
osully
时间:
2014-4-13 12:30
就是 在你调用contains方法的时候 底层调用了 equals方法
作者:
759345779
时间:
2014-4-13 13:17
equals是object类中定义的比较方法,其他类你上面的类创建默认继承object中的equals方法,
equals用于比较,你可以将其方法覆盖写入你自己的比较规则,比如字符串按照长度比较等。
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;
}
复制代码
这段代码就是覆盖掉原来的equals方法定义自己自己的比较规则,先按照姓名比较,再按照年龄比较,
singleElement 方法实现的是将重复的元素去除掉,其内部调用的contains默认会使用equals进行比较判断,
equals判断的依据就是你写入的判断规则
作者:
赵小豪
时间:
2014-4-13 14:20
关键代码是这里,
A是一个List,contains就是判断这个List里面是不是含有 obj这样的对象
是调用对象它们的equals方法比较 的。
之前有的对象就不会再加进去了。
最后返回一个List。
20140413141924835.jpg
(9.61 KB, 下载次数: 6)
下载附件
2014-4-13 14:19 上传
作者:
赵小豪
时间:
2014-4-13 15:00
你的代码我写了一次,并且在你注释那回答一下你的问题!
/*
*Person类
*/
public class Person {
private int age;
private String name;
Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
*重写equals方法,此处的equals的是Person类中的方法
*主要功能: List集合判断元素是否相同,依据是元素的equals方法。
*/
//布尔型覆盖父类中的object的equals方法
public boolean equals(Object obj)
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
Person p = (Person) obj;
//此处equals方法是字符串中的方法,字符串可以调用equals方法
return this.name.equals(p.name) && this.age == p.age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
以下是Test测试类
public static void main(String[] args) {
ArrayList a = new ArrayList();
a.add(new Person("lisi01",21));
a.add(new Person("lisi02",22));
a.add(new Person("lisi03",23));
a.add(new Person("lisi03",23));
a.add(new Person("lisi04",24));
a.add(new Person("lisi05",24));
//singleelement(a); 这个方法,就是去掉重复的元素,然后返回给a
a = singleElement(a);
Iterator i = a.iterator();
while(i.hasNext()){
Person p =(Person)i.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
public static ArrayList singleElement(ArrayList a)
{
ArrayList A = new ArrayList();
Iterator<String> i =a.iterator();
while(i.hasNext())
{
Object obj = i.next();
if(!A.contains(obj))
A.add(obj);
}
return A;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2