我想知道像下面这样的事情是否可能发生,
list.removeAll(namesToRemove)我希望上下文是可以理解的。
list的类型为ArrayList<MyObject>,其中MyObject具有getName方法。
namesToRemove是一个包含要删除的对象名称的ArrayList<String>。
我知道这可以通过重写MyObject类中的equals方法来实现。我想知道是否有其他选择。
发布于 2010-06-09 20:08:12
您可以使用Google Collections Collections2.filter()执行以下操作
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());
}
});发布于 2010-06-09 20:09:32
Java8:
list.removeIf(obj -> namesToRemove.contains(obj.getName()));Java7及更早版本:
Iterator<MyObject> iter = list.iterator();
while (iter.hasNext())
if (namesToRemove.contains(iter.next().getName()))
iter.remove();请注意,这两种选择都具有二次复杂性。您可以通过执行以下操作将其设置为线性
Set<String> namesToRemoveSet = new HashSet<>(namesToRemove);在代码段之前,使用namesToRemoveSet而不是namesToRemove。
发布于 2010-06-09 20:11:14
您不希望覆盖Object类中的任何内容。您需要使用a filter utility或使用您自己的语义的集合,而不是equals,可能是包装在您自己的equivalence实现周围的ForwardingCollection。
所有这些都可以使用google guava实现,而不会违反任何标准
https://stackoverflow.com/questions/3005513
复制相似问题