如何去除ArrayList中的重复元素?(相同的数据和属性值相等的用户自定义对象)

如何去除ArrayList中的重复对象?

1.去除重复字符串

去重方法

private ArrayList getList(List list){
ArrayList newList=new ArrayList();
Iterator iterator=list.iterator();
//如果已知数组中还有元素
while (iterator.hasNext()){
//newList中不包括该元素,那么就将该元素放进去
Object o = iterator.next();
if (!newList.contains(o))
newList.add(o);
}
return newList;
}

测试

@Test
public void test(){
List nowList=new ArrayList();
nowList.add(“鲁班”);
nowList.add(“鲁班”);
nowList.add(“后裔”);
//去重前
System.out.println(“去重前的数组------”+nowList);
//去重后
System.out.println(“去重后的数组------”+this.getList(nowList));
}

运行结果

如何去除ArrayList中的重复元素?(相同的数据和属性值相等的用户自定义对象)

2.去除用户自定义对象

我们发现在去除重复的自定义对象时,此方法无法做到:

@Test
public void test1(){
List nowList=new ArrayList();
nowList.add(new Hero(10,“鲁班”));
nowList.add(new Hero(10,“鲁班”));
nowList.add(new Hero(15,“后裔”));
//去重前
System.out.println(“去重前的数组------”+nowList);
//去重后
System.out.println(“去重后的数组------”+this.getList(nowList));
}

运行结果

如何去除ArrayList中的重复元素?(相同的数据和属性值相等的用户自定义对象)

这时候我们发现元素无法正常去重了,是因为contains方法底层是用的Object中的equals()方法进行比较
如何去除ArrayList中的重复元素?(相同的数据和属性值相等的用户自定义对象)
而equals()比较的是两个对象的引用地址,显然每次new People()时会创建不同的对象, 而二者在栈中的引用地址是不同的。
所以此时我们需要重写所要比较对象的equals方法

重写Hero的equals方法(未考虑属性值为空的情况)

@Override
public boolean equals(Object obj) {
//如果obj不为空而且该obj的类型和这个类的类型相同
if (obj!=null&&obj.getClass()==this.getClass()){
try {
//使用反射获取对象的所有属性
Field[] fields = obj.getClass().getDeclaredFields();
//循环获得每个属性的值然后进行比较,
// 只有在每个属性值都相等的时候返回true
for (Field field : fields) {
field.setAccessible(true);//设置私有变量的可见性
Object object1 = field.get(this);
Object object2 = field.get(obj);
//一旦有一个属性值不相等就返回false
if (!object1.equals(object2)){
return false;
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}

测试结果

如何去除ArrayList中的重复元素?(相同的数据和属性值相等的用户自定义对象)