嗨,大家好,我是作为面试问题来的,遇到了麻烦。我对泛型/集合和迭代器很熟悉,但是集合声明的方式完全让我失望。

这里的问题是:提供的工作空间中包含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;

08-07 23:52