我有2个Iterator,需要返回一个包含第一个对象的Iterator减去第二个包含的对象。 使用Apache.commons或Guava有什么好办法吗?
答案 0 :(得分:5)
问题在于,在决定第一个的任何成员是否属于结果时,您需要整个第二个迭代器。为了有效地做出决定,Set
优于List
。 Guava解决方案非常简单:
return Iterators.filter(first,
Predicates.not(Predicates.in(ImmutableSet.copyOf(second))));
答案 1 :(得分:2)
确实是个好问题。与apache.commons
- IteratorUtils
中的任务类类似。有一种方法public static ListIterator filteredListIterator(ListIterator listIterator, Predicate predicate)
,您可以使用这种方式:
final Iterator iterator1 = ...
final Iterator iterator2 = ...
Iterator iterator3 = IteratorUtils.filteredIterator(iterator1, new Predicate() {
private List list = IteratorUtils.toList(iterator2);
@Override
public boolean evaluate(Object object) {
return !list.contains(object);
}
});
答案 2 :(得分:2)
使用迭代器(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Iterators.html),您可以连接两个迭代器并将它们作为数组返回,使用集合进行换行,最后使用第二个元素删除集合的所有元素。
这是我的实施:
public <E> List<E> remove(Iterator<E> a, Iterator<E> b) {
List<E> remove = Lists.newArrayList(b);
Iterators.removeIf(a, new Predicate<>() {
@Override public boolean apply(E e) {
return remove.contains(e);
}
});
return Lists.newArrayList(a);
}
这是我的最终解决方案(我有编辑)。