Google – Jump Iterator
wrap 一个iterator 使得新的iterator的next() 返回旧iterator的next().next()
[Analysis]
没有想象中的那么简单,首先考虑一下,只有一个element的情况,hasNext()不能单纯的返回
it.hasNext()。
其次edge case想清楚:
1. 连续的hasNext()
2. 连续的next()
3. 第一次先call next()
4. 连续call next()值得最后一个,然后call hasNext()
当然还有最普通的case,
while (hasNext()) {
System.out.println(next())
}
[Solution]
Maintain一个top,
如果top不为null, hasNext()返回true,防止hasNext()被连续call的情况。否则找下一个,找不到就返回false.
如果top不为null,next()直接返回top,并重置top为null。否则找下一个,找不到就说明没有了。这样即使连续call next()也能保证元素按顺序输出并且保证hasNext()的正确性(类似上面第4个edge case)。
[Note]
无论iterator怎么用最好,或者什么code style最好,都不能无视edge case。即使正常人不会先call next(),或者根本就不call hasNext(),但是也不代表能容忍这种bug的存在。
Read full article from Google – Jump Iterator
wrap 一个iterator 使得新的iterator的next() 返回旧iterator的next().next()
[Analysis]
没有想象中的那么简单,首先考虑一下,只有一个element的情况,hasNext()不能单纯的返回
it.hasNext()。
其次edge case想清楚:
1. 连续的hasNext()
2. 连续的next()
3. 第一次先call next()
4. 连续call next()值得最后一个,然后call hasNext()
当然还有最普通的case,
while (hasNext()) {
System.out.println(next())
}
[Solution]
Maintain一个top,
如果top不为null, hasNext()返回true,防止hasNext()被连续call的情况。否则找下一个,找不到就返回false.
如果top不为null,next()直接返回top,并重置top为null。否则找下一个,找不到就说明没有了。这样即使连续call next()也能保证元素按顺序输出并且保证hasNext()的正确性(类似上面第4个edge case)。
[Note]
无论iterator怎么用最好,或者什么code style最好,都不能无视edge case。即使正常人不会先call next(),或者根本就不call hasNext(),但是也不代表能容忍这种bug的存在。
class
JumpIterator<T>
implements
Iterator<T> {
Iterator<T> it;
T top;
public
JumpIterator(Iterator<T> iterator) {
this
.it = iterator;
}
@Override
public
boolean
hasNext() {
if
(top !=
null
) {
return
true
;
}
else
if
(!it.hasNext()) {
return
false
;
}
it.next();
if
(it.hasNext()) {
top = it.next();
}
return
top !=
null
;
}
@Override
public
T next() {
if
(top !=
null
) {
T result = top;
top =
null
;
return
result;
}
else
{
if
(!it.hasNext()) {
return
null
;
}
else
{
it.next();
}
if
(!it.hasNext()) {
return
null
;
}
else
{
return
it.next();
}
}
}
}