简体   繁体   English

使用PushbackIterator合并列表?

[英]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小于值bIteraIter返回,而在价值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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM