嗨,大家好,我是作为面试问题来的,遇到了麻烦。我对泛型/集合和迭代器很熟悉,但是集合声明的方式完全让我失望。
这里的问题是:提供的工作空间中包含cocI,它是实现可用于迭代Collections的Iterator的类的开始。集合的集合被传递到类的构造函数中。迭代器应深度优先遍历内容。
例如,如果“收藏集”如下所示:
[0] – [“A”, “B”, “C”]
[1] – [“D”]
[2] – [“E”, “F”]
然后,迭代器应按以下顺序返回内容:“ A”,“ B”,“ C”,“ D”,“ E”,“ F”
Q.在cocI中为hasNext()和next()方法提供实现
谢谢
import java.util.Collection;
import java.util.Iterator;
public class cocI implements Iterator<Object> {
private Collection<Collection<Object>> _collOfColl = null;
public cocI(Collection<Collection<Object>> collofColl) {
_collOfColl = collofColl;
}
public boolean hasNext() {
// TODO implement this method
return false;
}
public Object next() {
// TODO implement this method
return null;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
最佳答案
一些介绍性说明:cocI
是一个奇怪的类名;它应该以大写字母开头。
您应该实现的接口没有有效地使用泛型。您应该能够使用比Object
更具体的数据类型。
优良作法是使用@Override
批注。
该解决方案涉及外部集合的迭代器和内部集合的迭代器。当内部迭代器的元素用完时,需要用一个迭代器替换下一个集合。但是,考虑到集合可能是空的,因此需要在循环中完成提升,我已将其放入advanceCollection()
帮助器中。
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class cocI<T> implements Iterator<T> {
private Iterator<Collection<T>> outerIterator;
private Iterator<T> innerIterator;
public cocI(Collection<Collection<T>> collofColl) {
this.outerIterator = collofColl.iterator();
advanceCollection();
}
@Override
public boolean hasNext() {
return this.innerIterator != null && this.innerIterator.hasNext();
}
@Override
public T next() {
if (this.innerIterator == null) {
throw new NoSuchElementException();
}
try {
return this.innerIterator.next();
} finally {
advanceCollection();
}
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
private void advanceCollection() {
while ((this.innerIterator == null || !this.innerIterator.hasNext())
&& this.outerIterator.hasNext()) {
this.innerIterator = this.outerIterator.next().iterator();
}
}
}
我使用了一段棘手的代码:
try {
return this.innerIterator.next();
} finally {
advanceCollection();
}
它大致相当于:
T result = this.innerIterator.next();
advanceCollection();
return result;