如何从基于自定义java对象而不是基元类型的列表中删除重复项?

2022-09-03 08:37:10

在我发布这个问题之前,我发现了类似的问题在这里发布。但答案是基于字符串的。但是,我在这里有不同的情况。我不是在尝试删除String,而是另一个名为AwardYearSource的对象。此类具有一个名为 year 的 int 属性。因此,我想根据年份删除重复项。也就是说,如果不止一次提到2010年,我想删除该AwardYearSource对象。我该怎么做?


答案 1

基于字段删除元素的最简单方法如下(保持顺序):

Map<Integer, AwardYearSource> map = new LinkedHashMap<>();
for (AwardYearSource ays : list) {
  map.put(ays.getYear(), ays);
}
list.clear();
list.addAll(map.values());

答案 2

另一种方法是覆盖 和 您的对象。由于它只有一个字段要用于确定相等性,因此这非常简单。像这样:hashCode()equals(Object obj)

public boolean equals(Object obj) {
  if (obj == null || !(obj instanceof AwardYearSource)) {
    return false;
  }
  return (this.year == ((AwardYearSource)obj).year);
}
public int hashCode() {
  return this.year;
}

然后,您可以将所有对象粘贴到 中删除重复项:Set

Set<AwardYearSource> set = new Set<AwardYearSource>();

set.add(new AwardYearSource(2011));
set.add(new AwardYearSource(2012));
set.add(new AwardYearSource(2011));

for (AwardYearSource aws : set) {
  System.out.println(aws.year);
}