
方法1: 这道题目我直接看的答案,因为对于java的iterator不熟。这道题目的关键就在于要保存顶部的元素,那我们方法1就是保存peek出来的元素。
// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
import java.util.NoSuchElementException;
class PeekingIterator implements Iterator<Integer> {
Iterator<Integer> iter;
Integer peeked = null;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
this.iter = iterator;
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
if(peeked == null){
if(!iter.hasNext()){
throw new NoSuchElementException();
}
peeked = iter.next();
}
return peeked;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
if(peeked != null){
Integer toReturn = peeked;
peeked = null;
return toReturn;
}
if(!iter.hasNext()){
throw new NoSuchElementException();
}
return iter.next();
}
@Override
public boolean hasNext() {
return peeked != null || iter.hasNext();
}
}
方法2: 保存next元素。
// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
import java.util.NoSuchElementException;
class PeekingIterator implements Iterator<Integer> {
private Iterator<Integer> iter;
private Integer next = null;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
if(iterator.hasNext()){
next = iterator.next();
}
iter = iterator;
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
return next;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
if(next == null)
throw new NoSuchElementException();
Integer toReturn = next;
next = null;
if(iter.hasNext()){
next = iter.next();
}
return toReturn;
}
@Override
public boolean hasNext() {
return next != null;
}
}
总结:
- 无
本文介绍两种实现Java迭代器的方法,一种是保存peek方法获取的元素,另一种是保存next方法返回的元素。这两种方法都实现了在不移动迭代器的情况下预览下一个元素的功能。





