如何去除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));
}

运行结果

在这里插入图片描述

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));
}

运行结果

在这里插入图片描述

这时候我们发现元素无法正常去重了,是因为contains方法底层是用的Object中的equals()方法进行比较
在这里插入图片描述
而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;
}

测试结果

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要查看某个`String`类型的变量是否是自定义类型的对象列表某个对象属性,您需要进行以下步骤: 1. 确保自定义类型的对象正确地重写了`equals()`方法。这是用于比较对象是否相等的方法。 2. 遍历自定义类型的对象列表,并使用`equals()`方法将每个对象与目标字符串进行比较。 下面是一个示例代码: ```java import java.util.ArrayList; import java.util.List; class CustomObject { private String property; public CustomObject(String property) { this.property = property; } // 重写equals()方法 @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } CustomObject other = (CustomObject) obj; return this.property.equals(other.property); } } public class Main { public static void main(String[] args) { List<CustomObject> list = new ArrayList<>(); list.add(new CustomObject("Apple")); list.add(new CustomObject("Banana")); list.add(new CustomObject("Orange")); String variable = "Banana"; boolean containsVariable = false; for (CustomObject obj : list) { if (obj.equals(new CustomObject(variable))) { containsVariable = true; break; } } if (containsVariable) { System.out.println("变量存在于列表"); } else { System.out.println("变量不存在于列表"); } } } ``` 在上述示例,我们定义了一个自定义对象`CustomObject`,它具有一个属性`property`。我们在`CustomObject`重写了`equals()`方法,以便通过比较`property`属性来判断两个对象是否相等。 然后,我们创建了一个`List`,并将几个`CustomObject`对象添加到列表。接下来,我们定义了一个名为`variable`的字符串变量,它将被用来检查是否存在于列表。 使用遍历循环,我们比较列表的每个对象与目标字符串(使用新创建的`CustomObject`进行比较)。如果找到匹配的对象,则设置`containsVariable`为`true`,并终止循环。最后,根据`containsVariable`的输出相应的消息。 希望这个示例对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值