我需要根據其他集合的內容篩選集合。通常,我會使用Collection.retainAll()
方法。
不幸的是,我處理的域對象的相等性是相當不穩定的,這取決於比較上下文。因此,我不能依靠equals/hashCode
。
我的下一個反應是使用自定義Comparator
,但我無法找到任何支持我想法的方法。實現這些功能不是問題,但我想在這裏重新發明輪子。
我錯過了API中的某些東西嗎?其他框架(不是太深奧)像普通人也是受歡迎的。
如果沒有,那麼什麼樣的優化會讓我的直接impl(通過在n^2中遍歷兩個集合中的所有項來創建兩個集合中的所有對象的列表)是一個好的方法?是否有自定義比較器的retainAll()的實現?
3
A
回答
3
建議使用Guava's filter。另一種方法是推出自己的retainAllBy(sourceCollection, Comparator)
。
1
我錯過了API中的一些東西嗎?
有沒有在Java集合框架,通過別的那麼標準equals
實施做了retainAll
。
強烈取決於你的用例,你可以這樣來做:
創建一個包裝對象,可以纏繞你的對象,但與equals
方法需要。然後使用該包裝來做retainAll
之後,您需要從結果集合中打開對象。
但這種方式有兩個缺點:
- 大量的對象將被創建
- 如果包裝的
equals
方法仍然是有效的它只能工作正確的equals方法中的java doc for equals方法上。
1
Guava對這個問題,Equivalence
概念有一個麻煩的解決方案。使用Equivalence.wrap()
將對象包裝爲等價對象,將包裝的版本存儲在集合中,從而使集合使用自定義的equals/hashcode邏輯。
我(和其他人)要求Equivalence-based sets and maps,但不幸的是,番石榴團隊建議應採取上述路線。
相關問題
- 1. 在postgresql中實現自定義比較
- 2. 具有自定義比較器的Collections.sort()是否對每對(a,b)進行比較(a,b)和比較(b,a)
- 3. Groovy自定義比較器
- 4. 在VB自定義Linq Provider中實現字符串比較器
- 5. 是否有可能在java中做比較器的東西,但實現自定義equals()和hashCode()
- 6. 實現比較比較的方法進行定義線
- 7. 比較器實現
- 8. 自定義比較器的效率
- 9. stl的自定義比較器
- 10. 自定義比較的ConcurrentSkipListMap
- 11. 帶有自己的比較器實現的TreeMap
- 12. ASP.NET:實現自定義MembershipProvider類是否需要您實現自定義Membership類?
- 13. 是否有可能創建System.Windows.Media.Projection的自定義實現
- 14. 無法在實現比較器的類中調用自定義方法
- 15. 如何比較自定義UITableViewCel中的標籤是否爲空?
- 16. 實現Java比較器
- 17. 實現比較器接口
- 18. 實現具有特定條件的比較器
- 19. 如何如果元組是沒有實現比較器的Java
- 20. STL地圖自定義比較器
- 21. 骨幹集合:自定義比較器
- 22. 自定義比較器datagridview排序
- 23. 用自定義比較器返回priority_queue
- 24. Linq自定義比較器包含?
- 25. 自定義驗證器比較
- 26. Java PriorityQueue自定義比較器
- 27. 自定義比較器不工作
- 28. 自定義比較器不排序
- 29. 與自定義比較器複合
- 30. 自定義比較器:需要說明
+1另一個番石榴解決方案,可能比我的 –
更好,可以通過用Predicate包裝集合然後過濾來完成。聽起來不錯。謝謝 – kostja