gpt4 book ai didi

java - 如何从java数组列表中删除重复的对象

转载 作者:行者123 更新时间:2023-12-02 04:35:57 25 4
gpt4 key购买 nike

我需要从我的对象数组列表中删除重复的对象。我通过创建对象的数组列表来尝试它。第一个包含所有对象,包括重复的对象,另一个仅包含唯一的对象。

ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>();//has duplicate
ArrayList<ListTableClass> ltc2 = new ArrayList<ListTableClass>();//unique

我使用 contains 方法来检查重复项,如下所示:

for (ListTableClass element : ltc) {
if (!ltc2.contains(element)) {
ltc2.add(element);
}
}

但这并不能删除重复项。它将 ltc 的所有元素添加到 ltc2 中。不知道为什么? ltc 确实包含重复的对象。

最佳答案

由于ArrayList的“contains”函数与两个对象的hashcode和equals函数进行比较,因此必须重写ListTableClass类的“hashCode”和“equals”函数。

示例:

import java.util.ArrayList;
public class ListTableClass {
private String name;
private int age;

public ListTableClass(String name, int age) {
super();
this.name = name;
this.age = age;
}

public static void main(String[] args) {
ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>();// has duplicate
ListTableClass obj0 = new ListTableClass("A", 0);
ListTableClass obj1 = new ListTableClass("B", 1);
ListTableClass obj2 = new ListTableClass("C", 2);
ListTableClass obj3 = new ListTableClass("A", 0);
ltc.add(obj0);
ltc.add(obj1);
ltc.add(obj2);
ltc.add(obj3);
ArrayList<ListTableClass> ltc2 = new ArrayList<ListTableClass>();// unique
for (ListTableClass element : ltc) {
if (!ltc2.contains(element)) {
System.out.println(element);
ltc2.add(element);
}
}
}
}

覆盖之前的输出 hashCode:

y2015.m06.d10.ListTableClass@659e0bfd //obj0 {"A", 0}
y2015.m06.d10.ListTableClass@2a139a55 //obj1 {"B", 1}
y2015.m06.d10.ListTableClass@15db9742 //obj2 {"C", 2}
y2015.m06.d10.ListTableClass@6d06d69c //obj3 {"A", 0} is different from obj0

添加覆盖函数hashCode:

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ListTableClass other = (ListTableClass) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

那么输出是:

y2015.m06.d10.ListTableClass@402 //obj0
y2015.m06.d10.ListTableClass@422 //obj1
y2015.m06.d10.ListTableClass@442 //obj2

不存在 obj3,因为 obj3 的 hashcode 且其属性与 obj0 相等

关于java - 如何从java数组列表中删除重复的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com