2

などのメソッドenqueueを持つ独自の ArrayQueue クラスがあります。私のクラスはこのクラスを拡張し、以下を含みます。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それが理にかなっている場合は、2 つのキューからの要素をインターリーブするメソッドが必要です。それらを正常に追加する方法、または両方のキューを引数として渡すメソッドを使用する方法を知っていますが、この場合、上記のメソッド(1つだけを渡す)を使用したい...

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<>はJava7の機能です

于 2012-11-21T22:26:53.913 に答える