Set*_*iei 27 java generics iterator
假设我有这个:
public class Unit<MobileSuit, Pilot> {
...
List<MobileSuit> mobileSuits;
List<Pilot> pilots;
...
}
Run Code Online (Sandbox Code Playgroud)
我想以最简单的方式在该类之外迭代这对中的每一对.我应该怎么做呢?我想过这样做:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
沿着那条线的东西.
无论如何,问题是我不能真正从next()返回一个对象,而且我也不能让Iterator占用多个类型.那么,有什么想法吗?
另外,我不能组建一个新的课程来结合MobileSuit和Pilot.我需要将它们分开,即使我一次迭代它们.原因是可能有没有飞行员的移动套装,我不知道如何通过将它们保持在同一级别来解决这个问题.这个类需要在其他地方进行处理,所以我必须统一一个接口和其他很多东西.基本上,假设MobileSuit和Pilot需要分开.
Ste*_*n C 12
无论如何,问题是我不能真正从next()返回一个对象,而且我也不能让Iterator占用多个类型.那么,有什么想法吗?
显然你需要一个轻量级的"配对"级别.这大致类似于Map.Entry内部阶级.
这是一个通用解决方案的粗略切入点:
public class ParallelIterator <T1, T2> implements Iterator<Pair<T1, T2>> {
public class Pair<TT1, TT2> {
private final TT1 v1;
private final TT2 v2;
private Pair(TT1 v1, TT2 v2) { this.v1 = v1; this.v2 = v2; }
...
}
private final Iterator<T1> it1;
private final Iterator<T2> it2;
public ParallelIterator(Iterator<T1> it1, Iterator<T2> it2) {
this.it1 = it1; this.it2 = it2;
}
public boolean hasNext() { return it1.hasNext() && it2.hasNext(); }
public Pair<T1, T2> next() {
return new Pair<T1, T2>(it1.next(), it2.next());
}
...
}
Run Code Online (Sandbox Code Playgroud)
注意:这并未明确处理列表长度不同的情况.将会发生的事情是,较长列表末尾的额外元素将被忽略.
这是从Stephen C的回答中复制+编辑的.随意使用:
public class Pair<T1, T2> {
private final T1 v1;
private final T2 v2;
Pair(T1 v1, T2 v2) {
this.v1 = v1;
this.v2 = v2;
}
public T1 first(){
return v1;
}
public T2 second(){
return v2;
}
}
public class ParallelIterator <T1, T2> implements Iterator<Pair<T1, T2>> {
private final Iterator<T1> it1;
private final Iterator<T2> it2;
public ParallelIterator(Iterator<T1> it1, Iterator<T2> it2) {
this.it1 = it1; this.it2 = it2;
}
@Override
public boolean hasNext() { return it1.hasNext() && it2.hasNext(); }
@Override
public Pair<T1, T2> next() {
return new Pair<T1, T2>(it1.next(), it2.next());
}
@Override
public void remove(){
it1.remove();
it2.remove();
}
}
public class IterablePair <T1, T2> implements Iterable<Pair<T1,T2>> {
private final List<T1> first;
private final List<T2> second;
public IterablePair(List<T1> first, List<T2> second) {
this.first = first;
this.second = second;
}
@Override
public Iterator<Pair<T1, T2>> iterator(){
return new ParallelIterator<T1,T2>( first.iterator(), second.iterator() );
}
}
void someFunction(){
IterablePair<X,Y> listPair = new IterablePair<X,Y>( x, y );
for( Pair<X,Y> pair : listPair ){
X x = pair.first();
...
}
}
Run Code Online (Sandbox Code Playgroud)
一旦列表超出元素,这就会停止,因此您可能希望在创建IterablePair之前检查具有相同大小的列表.