匿名覆盖HashSet hashCode

时间:2011-09-18 07:08:08

标签: java android

我正在尝试使用HashSetApplicationInfo个对象列表中删除重复项,并且我正在尝试使用更高级的方法来完成此操作,而不是使用旧的循环并进行比较。

我最近一直在学习Java中的匿名能力,而我正试图在这里应用它,但我被卡住了。根据我的理解,equals()只是使用hashCode()方法来确定相等性,并且从我收集的内容中我只需要覆盖hashCode()方法。

ApplicationInfo对象中是一个名为packageName的字段,一个字符串,这是我希望HashSet比较并排除任何重复字段的唯一字段。

由于我是Java的新手,所以如果我理解这一点,无论是哪种方式,如何做到这一点,我都会喜欢帮助理解。我意识到我可以扩展HashSet并按照这种方式进行,但我想尝试这个匿名协议,以便我学到一些东西。

如果我有一个包含ApplicationInfo对象的HashSet,如何根据packageName字段返回一个hashCode?

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

2 个答案:

答案 0 :(得分:4)

不幸的是HashSet不允许您使用自定义相等/哈希比较。您的尝试将覆盖hashCode,而不是集合中的每个

如果包名称​​总是是一个适当的相等指标,您可以覆盖hashCode本身的equalsApplicationInfo。否则,我认为最好的办法是创建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进行索引?