我有:对象数组:{o1, o2, o3, o4, ...}。假设我从o2对象开始迭代。我可能会遇到一种情况,即相应的对象很少。我的意思是o2相同o3相同o4

通过same我了解o1.getSomeField().equals(o2.getSomeField())

我想要:每次我切换到不同对象时,都要遍历数组并进行一些处理。

示例:假设o2相同o3但不相同o4。然后是迭代步骤:


o2切换到o3
啊哈,他们是一样的,什么也没做
o3切换到o4
o3o4不同。对{o2,o3,o4}子数组做一些额外的逻辑


问题:该怎么做?番石榴中有什么可以帮助我的吗?

Question2:有没有现成的库,可以将我的初始数组划分为带有same元素的子数组? (通过same我了解o1.getSomeField().equals(o2.getSomeField())

最佳答案

这是我的想法,我可以在评论中说,您可以像这样实现一个迭代器(可能需要进行一些修改,因为这种方式消耗了第一个不同的元素,因此

{ o1, o1, o2, o2, o3 }将是{ o1, o1, o2 } {o2, o3},但可以轻松解决

public class CollectingIterator implements Iterator<Collection<MyClass>> {


    private boolean hasNext;
    private LinkedList<MyClass> next = new LinkedList<MyClass>();

    private final Iterator<MyClass> baseIterator;

    public CollectingIterator(Iterator<MyClass> baseIterator) {
        this.baseIterator = baseIterator;
        toNext();
    }

    @Override
    public boolean hasNext() {
        return hasNext;
    }

    @Override
    public Collection<MyClass> next() {
        Collection<MyClass> next = new LinkedList<MyClass>(this.next);
        toNext();
        return next;
    }

    private void toNext() {
        next.clear();
        boolean isSame = true;
        while (baseIterator.hasNext() && isSame) {
            if (next.isEmpty()) {
                next.add(baseIterator.next());
            } else {
                final MyClass nextElement = baseIterator.next();
                final MyClass last = next.getLast();
                next.add(nextElement);
                if (!last.getSomeField().equals(nextElement.getSomeField())) {
                    isSame = false;
                }
            }
        }

        this.hasNext = baseIterator.hasNext() || !next.isEmpty();
    }
}


然后,您可以使用番石榴IterablesFluentIterable做进一步的逻辑。尽管如果是一次性处理,那么您可能会因另一种答案中的建议而更好

关于java - Guava :进行中间处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23740550/

10-10 04:19