我正在尝试使用HashSet
从ApplicationInfo
个对象列表中删除重复项,并且我正在尝试使用更高级的方法来完成此操作,而不是使用旧的循环并进行比较。
我最近一直在学习Java中的匿名能力,而我正试图在这里应用它,但我被卡住了。根据我的理解,equals()
只是使用hashCode()
方法来确定相等性,并且从我收集的内容中我只需要覆盖hashCode()
方法。
在ApplicationInfo
对象中是一个名为packageName
的字段,一个字符串,这是我希望HashSet
比较并排除任何重复字段的唯一字段。
由于我是Java的新手,所以如果我理解这一点,无论是哪种方式,如何做到这一点,我都会喜欢帮助理解。我意识到我可以扩展HashSet
并按照这种方式进行,但我想尝试这个匿名协议,以便我学到一些东西。
如果我有一个包含ApplicationInfo对象的HashSet,如何根据packageName字段返回一个hashCode? p>
//Help me fix the below idea please
HashSet<ApplicationInfo> hs = new HashSet<ApplicationInfo>() {
@Override
public int hashCode() {
// How do I do this sort of thing
return this.packageName.hashCode();
}
};
答案 0 :(得分:4)
不幸的是HashSet
不允许您使用自定义相等/哈希比较。您的尝试将覆盖集的hashCode
,而不是集合中的每个项。
如果包名称总是是一个适当的相等指标,您可以覆盖hashCode
本身的equals
和ApplicationInfo
。否则,我认为最好的办法是创建HashMap<String, ApplicationInfo>
映射名称到包。假设您为特定名称最终得到哪个包无关紧要,您可以循环:
Map<String, ApplicationInfo> nameMap = new HashMap<String, ApplicationInfo>();
for (ApplicationInfo pkg : packages) {
nameMap.put(pkg.packageName, pkg);
}
答案 1 :(得分:0)
在您的代码中,this
实际上是匿名类的实例,而不是ApplicationInfo
对象。你也不会得到你想要的东西。
为什么不使用HashMap< String, ApplicationInfo >
代替packageName
进行索引?