【发布时间】:2011-03-09 10:52:02
【问题描述】:
假设我有这个:
public class Unit<MobileSuit, Pilot> {
...
List<MobileSuit> mobileSuits;
List<Pilot> pilots;
...
}
而且我想在该类之外以最简单的方式遍历这对。我该怎么做呢?我想过这样做:
public class Unit<MobileSuit, Pilot> {
...
Iterator<MobileSuit> iteratinMechas;
Iterator<Pilot> iteratinPeople;
class IteratorCustom<MobileSuit, Pilot> implements Iterator {
public boolean hasNext() {
return iteratinMechas.hasNext() && iteratinPeople.hasNext();
}
public void remove() {
iteratinMechas.remove();
iteratinPeople.remove();
}
public Object next() {
// /!\
}
}
public Iterator iterator() {
return new IteratorCustom<MobileSuit, Pilot>(mobileSuits, pilots);
}
}
类似的东西。
无论如何,问题是我不能真正从 next() 返回单个对象,而且我也不能让迭代器采用多种类型。那么,有什么想法吗?
另外,我无法创建一个新课程来结合 MobileSuit 和 Pilot。我需要将它们分开,即使我一次遍历两者。原因是可能有没有飞行员的机动战士,我不知道如何通过将它们保持在同一级别来解决这个问题。这个类需要在其他地方处理,所以我必须围绕它和很多其他东西统一一个接口。基本上,假设 MobileSuit 和 Pilot 需要分开。
【问题讨论】:
-
如果有没有飞行员的机动战士,我假设你的机动战士比飞行员多。这可能会使您对 hasNext() 的检查有问题,因为只有在两个列表中都有更多项目时它才会返回 true。如果您能提供更多关于如何将两者结合起来的标准的信息,我认为这将有助于回答您的问题。
-
@Rob Cooney 是的,既然你提到了它,那 hasNext() 至少是错误的。
-
OMG +1 回答高达式的问题。
-
非常有趣的问题。在stackoverflow.com/questions/1115563/… 之前我没有听说过拉链,所以我想知道“为什么番石榴不支持它?”显然它是在内部进行的。已经有一些关于在外部支持它的讨论-见code.google.com/p/guava-libraries/issues/detail?id=35这里有一个相关问题stackoverflow.com/questions/5278040/…
-
对于遍历并行集合的一般情况,请参阅How to most elegantly iterate through parallel collections?,虽然这里有所不同,因为您想在 类之外进行迭代。