我想計算集合之間的差異。當使用CollectionUtils.subtract()進行自定義比較時,我需要重寫對象的equals()方法。但是如果我需要比較相同類型但不同比較標準的對象集合呢?比較器接口怎麼樣,它在這裏看起來非常適合? AFAIK比較器主要用於分類。沒有使用比較器進行減法的方法嗎?如何用比較器接口減去集合而不是覆蓋等於
回答
如果您有一個ArrayList,多次刪除可能比採取副本更昂貴。
List<Type> list = /* ArrayList */
Set<Type> toRemove = /* HashSet */
List<Type> copy = new ArrayList<Type>(list.size());
for(Type t: list)
if(!toRemove.contains(t))
copy.add(t);
list = copy;
個人而言,我會用一個循環。它可能會更短,更清晰。
Collection<Type> collection =
for(Iterator<Type> i=collection.iterator(); i.hasNext();)
if (i.next() is to be removed)
i.remove();
顯式使用Iterator的原因是使用Iterator.remove(),它避免了ConcurrentModificationException。避免它的另一種方法是使用可能優選的集合的副本。
for(Type t : new ArrayList<Type>(collection))
if (t is to be removed)
collection.remove(t);
這表現不佳,但可能表現不錯。
這可能會導致異常,因爲在循環播放時修改集合,因此您必須複製 –
如果使用'Iterator.remove()',則不適用。如果您在另一個線程中修改集合,則無論是否複製,都可能會遇到異常。 –
@Frank Meulenaar,我已經包括了你所提出的替代方案,但是兩者都可以工作。 –
static <Type> Collection<Type> subtract(Collection<Type> a, Collection<Type> b, Comparator<Type> c) {
Set<Type> subtrahend = new TreeSet<Type>(c);
subtrahend.addAll(b);
Collection<Type> result = new ArrayList<Type>();
for (Type item: a) {
if (!subtrahend.contains(item)) result.add(item);
}
return result;
}
的subtrahent
樹集是沒有必要的,但將改善大b
性能。
這裏的比較器僅用於排序收集項目。 removeAll()再次使用類型的equals方法,而不是比較器提供的任何邏輯 – mamuesstack
確定嗎? TreeSet內部使用一個TreeMap,其中'remove()'依賴'getEntry()',它使用比較器。 – Cephalopod
似乎'比較器不符合等號'equals()'的'TreeSet'遇到'removeAll()'的問題。請看看[這裏](http://lingpipe-blog.com/category/java/page/5/)。 – mamuesstack
- 1. 覆蓋等於和比較字符串
- 2. F#集合的覆蓋比較
- 3. EF Hashset集合 - 覆蓋等於和GetHashCode
- 4. 覆蓋Backbone.js比較器
- 5. Java集合集合 - 覆蓋等於方法
- 6. 如何覆蓋或更改骨幹網收集比較器?
- 7. 覆蓋等價比較在Javascript
- 8. 減去覆蓋類和子
- 9. Java中的比較器集等於
- 10. 不覆蓋比較運算符的Python對象是否等於自己?
- 11. 爲什麼字符串實現可比較而不是比較器接口
- 12. 和。減去比較SQL
- 13. 覆蓋等於不工作
- 14. mysqldump合併,而不是覆蓋
- 15. Git合併覆蓋而不是衝突
- 16. 覆蓋GAE屬性的可比較接口?
- 17. IComparer接口的C#覆蓋比較方法
- 18. Networkx min_weighted_vertex_cover整個集合而不是頂點覆蓋
- 19. Java接口比較器靜態比較
- 20. 可比較和比較器接口
- 21. LINQ等於覆蓋
- 22. 在覆蓋等於
- 23. 集合和比較器
- 24. 如何覆蓋winforms組合框項目集合以實現特定接口
- 25. 如何覆蓋(而不是OOP覆蓋)System.out.print()的輸出?
- 26. 在java中檢查對象是否等於不等於覆蓋
- 27. 覆蓋HashCode如果我不需要覆蓋等於
- 28. 與NSubstitue代理對象覆蓋的C#集合等於
- 29. 覆蓋等於方法不起作用
- 30. 實現比較器接口
我們_override_'等於',而不是_overwrite_它! :) – adarshr
@adarshr當然,謝謝你的提示。我更新了標題 – mamuesstack