如何从基于自定义java对象而不是基元类型的列表中删除重复项?
在我发布这个问题之前,我发现了类似的问题在这里发布。但答案是基于字符串的。但是,我在这里有不同的情况。我不是在尝试删除String,而是另一个名为AwardYearSource的对象。此类具有一个名为 year 的 int 属性。因此,我想根据年份删除重复项。也就是说,如果不止一次提到2010年,我想删除该AwardYearSource对象。我该怎么做?
在我发布这个问题之前,我发现了类似的问题在这里发布。但答案是基于字符串的。但是,我在这里有不同的情况。我不是在尝试删除String,而是另一个名为AwardYearSource的对象。此类具有一个名为 year 的 int 属性。因此,我想根据年份删除重复项。也就是说,如果不止一次提到2010年,我想删除该AwardYearSource对象。我该怎么做?
基于字段删除元素的最简单方法如下(保持顺序):
Map<Integer, AwardYearSource> map = new LinkedHashMap<>();
for (AwardYearSource ays : list) {
map.put(ays.getYear(), ays);
}
list.clear();
list.addAll(map.values());
另一种方法是覆盖 和 您的对象。由于它只有一个字段要用于确定相等性,因此这非常简单。像这样: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);
}