首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合removeAll方法

集合removeAll方法
EN

Stack Overflow用户
提问于 2010-06-09 19:53:47
回答 5查看 6.6K关注 0票数 1

我想知道像下面这样的事情是否可能发生,

代码语言:javascript
复制
list.removeAll(namesToRemove)

我希望上下文是可以理解的。

list的类型为ArrayList<MyObject>,其中MyObject具有getName方法。

namesToRemove是一个包含要删除的对象名称的ArrayList<String>

我知道这可以通过重写MyObject类中的equals方法来实现。我想知道是否有其他选择。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-09 20:08:12

您可以使用Google Collections Collections2.filter()执行以下操作

代码语言:javascript
复制
final List<String> namesToKeep = getNamesToFilter();
List<MyObject> filtered = Collections2.filter(originalList, new Predicate<MyObject>() {
  @Override
  public boolean apply(MyObject o) {
    return namesToKeep.contains(o.getName());
  }
});
票数 4
EN

Stack Overflow用户

发布于 2010-06-09 20:09:32

Java8:

代码语言:javascript
复制
list.removeIf(obj -> namesToRemove.contains(obj.getName()));

Java7及更早版本:

代码语言:javascript
复制
Iterator<MyObject> iter = list.iterator();
while (iter.hasNext())
    if (namesToRemove.contains(iter.next().getName()))
        iter.remove();

请注意,这两种选择都具有二次复杂性。您可以通过执行以下操作将其设置为线性

代码语言:javascript
复制
Set<String> namesToRemoveSet = new HashSet<>(namesToRemove);

在代码段之前,使用namesToRemoveSet而不是namesToRemove

票数 4
EN

Stack Overflow用户

发布于 2010-06-09 20:11:14

您不希望覆盖Object类中的任何内容。您需要使用a filter utility或使用您自己的语义的集合,而不是equals,可能是包装在您自己的equivalence实现周围的ForwardingCollection

所有这些都可以使用google guava实现,而不会违反任何标准

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3005513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档