2011-09-18 49 views
2

我想使用HashSetApplicationInfo對象列表中刪除重複項,我嘗試使用更高級的方法來完成此操作,而不是比較好的舊循環並進行比較。匿名重寫HashSet hashCode

我最近一直在學習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(); 
    } 
}; 

回答

4

不幸的是HashSet不允許您使用自定義相等/散列比較。您的嘗試將覆蓋集合集合hashCode而不是集合中的每個項目

如果包名是總是適當平等的指標,我們可以覆蓋在ApplicationInfo本身hashCodeequals。否則,我認爲你最好的辦法是創建一個HashMap<String, ApplicationInfo>映射名稱到包。假設這不要緊,你到底哪款包了一個特別的名字,你可以循環:

Map<String, ApplicationInfo> nameMap = new HashMap<String, ApplicationInfo>(); 
for (ApplicationInfo pkg : packages) { 
    nameMap.put(pkg.packageName, pkg); 
} 
+0

好的,有道理。感謝您的快速回答。 – Kirk

+0

我相信你的意思是ApplicationInfo pkg:packages –

+1

@lukas:謝謝。怪C#的影響:) –

0

在你的代碼,this實際上是一個匿名類,而不是一個ApplicationInfo對象的實例。而且你也不會以這種方式得到你想要的東西。

爲什麼不用HashMap< String, ApplicationInfo >代替,並用packageName來索引它?

相關問題