我有:对象数组:{o1, o2, o3, o4, ...}
。假设我从o2
对象开始迭代。我可能会遇到一种情况,即相应的对象很少。我的意思是o2
相同o3
相同o4
。
通过same
我了解o1.getSomeField().equals(o2.getSomeField())
我想要:每次我切换到不同对象时,都要遍历数组并进行一些处理。
示例:假设o2
相同o3
但不相同o4
。然后是迭代步骤:
从o2
切换到o3
啊哈,他们是一样的,什么也没做
从o3
切换到o4
o3
和o4
不同。对{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();
}
}
然后,您可以使用番石榴Iterables或FluentIterable做进一步的逻辑。尽管如果是一次性处理,那么您可能会因另一种答案中的建议而更好
关于java - Guava :进行中间处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23740550/