将列表与PushbackIterator合并?

时间:2016-10-20 20:50:59

标签: java merge iterator

我必须使用PushbackIterator使用pushback(E)方法。

因此,如果aIter中的值小于bIter中的值,则会返回aIter,而bIter中的值会被放入pushback(E)方法,反之亦然。

如果原始列表是

  

(1,4,5)和(2,3,6)

然后结果列表将是

  

(1,2,3,4,5,6)

我相信我需要确定迭代器是否没有值。因此,如果bIter没有更多元素,我从aIter获取一个元素并将其添加到结果列表中。

如何确定迭代器是否没有更多值?

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;
}

1 个答案:

答案 0 :(得分:1)

如果其中一个迭代器没有更多元素,则while终止,因此之后您只需添加迭代器的其余元素:

while (aIter.hasNext()) {
    result.add(aIter.next());
}
while (bIter.hasNext()) {
    result.add(bIter.next());
}

顺便说一句,您的代码有一些缺陷,因为您在添加元素之前多次调用.next()。因此,您将跳过元素。试试这个:

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;
}