迭代器减法

时间:2014-08-13 08:38:32

标签: java iterator guava

我有2个Iterator,需要返回一个包含第一个对象的Iterator减去第二个包含的对象。 使用Apache.commons或Guava有什么好办法吗?

3 个答案:

答案 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);
}

这是我的最终解决方案(我有编辑)。