[英]Merging Lists with a PushbackIterator?
I have to use a PushbackIterator
which uses a pushback(E)
method. 我必须使用使用pushback(E)
方法的PushbackIterator
。
So if the value in aIter
is less than the value in bIter
, aIter
is returned, while the value in bIter
is put into the pushback(E)
method, and vice versa. 因此,如果在价值aIter
小于值bIter
, aIter
返回,而在价值bIter
放入pushback(E)
方法,反之亦然。
If the original lists are 如果原始清单是
(1, 4, 5) and (2, 3, 6) (1、4、5)和(2、3、6)
then the result list would be 那么结果列表将是
(1, 2, 3, 4, 5, 6) (1,2,3,4,5,6)
. 。
I believe that I need to determine if an iterator has no values left. 我相信我需要确定迭代器是否还没有值。 So if bIter has no more elements, I get an element from aIter and add it to the result list. 因此,如果bIter没有更多元素,则从aIter获取一个元素并将其添加到结果列表中。
How would I determine if an iterator has no more values? 我如何确定迭代器是否没有更多值?
public static<E extends Comparable<E>> List<E> mergeSortedLists(List<E> a, List<E> b) {
List<E> result = new ArrayList<E>();
PushbackIterator<E> aIter = new PushbackIterator<E>(a.iterator());
PushbackIterator<E> bIter = new PushbackIterator<E>(b.iterator());
while (aIter.hasNext() && bIter.hasNext()) {
if (aIter.next().compareTo(bIter.next()) < 0) {
result.add(aIter.next());
aIter.pushback(bIter.next());
}
if (aIter.next().compareTo(bIter.next()) > 0)
result.add(bIter.next());
bIter.pushback(aIter.next());
}
return result;
}
The while
terminates if one of the iterators has no more elements, thus afterwards you can just add the remaining elements of the iterators: 如果其中一个迭代器没有更多元素, while
终止,因此之后,您只需添加迭代器的其余元素即可:
while (aIter.hasNext()) {
result.add(aIter.next());
}
while (bIter.hasNext()) {
result.add(bIter.next());
}
Btw, your code has some flaws since you call .next()
multiple times before adding an element. 顺便说一句,您的代码存在一些缺陷,因为您在添加元素之前多次调用.next()
。 Because of this you will skip elements. 因此,您将跳过元素。 Try this: 尝试这个:
public static<E extends Comparable<E>> List<E> mergeSortedLists(List<E> a, List<E> b) {
List<E> result = new ArrayList<E>();
PushbackIterator<E> aIter = new PushbackIterator<E>(a.iterator());
PushbackIterator<E> bIter = new PushbackIterator<E>(b.iterator());
while (aIter.hasNext() && bIter.hasNext()) {
E aElem = aIter.next();
E bElem = bIter.next();
if (aElem.compareTo(bElem) <= 0) {
result.add(aElem);
bIter.pushback(bElem);
} else {
result.add(bElem);
aIter.pushback(aElem);
}
}
while (aIter.hasNext()) {
result.add(aIter.next());
}
while (bIter.hasNext()) {
result.add(bIter.next());
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.