在Java中合并队列

时间:2012-11-21 21:22:30

标签: java queue

我有自己的ArrayQueue类,其中包含enqueuedequeuepeek等方法。我的ArrayQmerge类扩展了此类并包含:

    public void mergeQs(ArrayQmerge q){

    }

我想知道最好的方法是编写一个方法来合并ArrayQueue和另一个Queue,而不从传递的q中删除任何元素。

例如。 queue1 = [1,2,3,4,11]queue2 = [5,6,7,8,9,10,12]。 调用queue1.mergeQs(queue2)后,它会创建queue1 = [1,5,2,6,3,7,4,8,11,9,10,12]queue2将保留[5,6,7,8,9,10,12]

如果有意义,我希望mergeQs方法交错两个队列中的元素。我知道如何成功地将它们一起添加或使用将两个队列作为参数传递的方法,但在这种情况下我想使用上面的方法(只传递一个)...

2 个答案:

答案 0 :(得分:1)

这是你可以做的:

public static void main(String[] args) {
    ArrayQmerge q1 = new ArrayQmerge();
    q1.enqueue(1);
    q1.enqueue(2);
    q1.enqueue(3);
    q1.enqueue(4);
    q1.enqueue(11);
    ArrayQmerge q2 = new ArrayQmerge();
    q2.enqueue(5);
    q2.enqueue(6);
    q2.enqueue(7);
    q2.enqueue(8);
    q2.enqueue(9);
    q2.enqueue(10);
    q2.enqueue(12);
    System.out.println(q1);
    System.out.println(q2);
    q1.mergeQs(q2);
    System.out.println(q1);
    System.out.println(q2);
}

static class ArrayQmerge{
    private List<Integer> queue = new ArrayList<Integer>();

    public void enqueue(int val){
        queue.add(val);
    }

    public String toString(){
        return queue.toString();
    }

    public void mergeQs(ArrayQmerge q){
        List<Integer> mergedQ = new ArrayList<Integer>(this.queue.size() + q.queue.size());
        for (int i = 0, j = 0; i < this.queue.size() || j < q.queue.size();){
            if (i < this.queue.size())
                mergedQ.add(this.queue.get(i++));
            if (j < q.queue.size())
                mergedQ.add(q.queue.get(j++));
        }
        this.queue = mergedQ;
   }
}

这是输出:

[1, 2, 3, 4, 11]
[5, 6, 7, 8, 9, 10, 12]
[1, 5, 2, 6, 3, 7, 4, 8, 11, 9, 10, 12]
[5, 6, 7, 8, 9, 10, 12]

答案 1 :(得分:0)

这是你如何合并q1 + q2 =&gt; q3交错元素:

    Queue<Integer> q1 = new ArrayDeque<>(Arrays.asList(1,2,3,4,11));
    Queue<Integer> q2 = new ArrayDeque<>(Arrays.asList(5,6,7,8,9,10,12));
    Queue<Integer> q3 = new ArrayDeque<>();
    Iterator<Integer> i1 = q1.iterator();
    Iterator<Integer> i2 = q2.iterator();
    for(;;) {
        if (i1.hasNext()) {
            q3.add(i1.next());
        }
        if (i2.hasNext()) {
            q3.add(i2.next());
        }
        if (!i1.hasNext() && !i2.hasNext()) {
            break;
        }
    }
    System.out.println(q3);

注意:新的ArrayDeque&lt;&gt;是Java 7功能