如何使用Comparator接口减去集合而不是覆盖等于

mam*_*ack 5 java collections comparator

我想计算集合之间的差异。使用CollectionUtils.subtract()进行自定义比较时,我需要重写对象的equals()方法。但是,如果我需要比较相同类型但比较标准不同的对象集合怎么办?那么比较器界面呢,似乎非常适合这里?AFAIK比较器主要用于排序。没有使用比较器进行减法的方法吗?

Pet*_*rey 2

如果您有一个 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;
Run Code Online (Sandbox Code Playgroud)

我个人会使用循环。它可能会更短、更清晰。

Collection<Type> collection =

for(Iterator<Type> i=collection.iterator(); i.hasNext();)
   if (i.next() is to be removed)
       i.remove();
Run Code Online (Sandbox Code Playgroud)

显式使用 Iterator 的原因是使用 Iterator.remove() 来避免 ConcurrentModificationException。避免这种情况的另一种方法是使用可能首选的集合的副本。

for(Type t : new ArrayList<Type>(collection))
   if (t is to be removed)
       collection.remove(t);
Run Code Online (Sandbox Code Playgroud)

这虽然表现不佳,但可能表现得足够好。

  • @Frank Meulenaar,我已经包含了您建议的替代方案,尽管两者都可以。 (2认同)