2

我有自己的 ArrayQueue 类,它有方法等enqueue。我的类扩展了这个类并包含:dequeuepeekArrayQmerge

    public void mergeQs(ArrayQmerge q){

    }

我想知道在不从传递的 q 中删除任何元素的情况下,编写将 ArrayQueue 与另一个 Queue 合并的方法的最佳方法是什么。

例如。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如果有意义的话,我希望该方法可以将两个队列中的元素交错。我知道如何成功地将它们添加在一起或使用将两个队列作为参数传递的方法,但在这种情况下,我想使用上述方法(仅传递一个)...

4

2 回答 2

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]
于 2012-11-21T22:18:48.867 回答
0

这就是合并 q1 + q2 => 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<> 是 Java 7 的特性

于 2012-11-21T22:26:53.913 回答