0

渡された q から要素を削除せずに ArrayQueue を別の Queue とマージするメソッドを作成する最良の方法は何だろうと思っていました。

eg. queue1 = [1,2,3,4] and queue2 = [5,6,7,8,9,10].

呼び出されたときqueue1.mergeQs(queue2)、それは作成されますがqueue1 = [1,5,2,6,3,7,4,8,9,10]queue2残ります[5,6,7,8,9,10]

    public void mergeQs(ArrayQmerge q){}

この方法は、両方の Queue を渡して新しいマージされた Queue を返す場合よりも実装が難しいようです。ありがとう。

明確にするために、2 つのキューの要素をインターリーブする方法を探しています。

4

3 に答える 3

1

役立つかもしれない詳細の 1 つは、Javaの同じクラスの異なるオブジェクト間でプライベート フィールドが表示されることです。つまり、独自のクラスのキューをマージするだけである限り、コードは、要素を格納するために使用する配列など、すべての内部フィールドに完全にアクセスできます。

最も単純なケースでは、すべての要素が線形配列に格納され、キュー ヘッドがインデックス 0 にある場合、次のようなものから始めることができます。

public void mergeQs(ArrayQmerge q) {
    Object[] array = new Object[this.size() + q.size()];

    int i;
    int o;

    // Interleave elements
    for (i = 0, o = 0; i < this.size() && i < q.size(); ++i) {
        array[o++] = this.array[i];
        array[o++] = q.array[i];
    }

    // Copy the remaining elements
    while (i < this.size()) {
        array[o++] = this.array[i++];
    }

    while (i < q.size()) {
        array[o++] = q.array[i++];
    }

    this.array = array;
}
于 2012-11-21T21:38:31.063 に答える
0

mergeメソッドでローカルに新しいキューを作成してから、クラスのキューをローカルバージョンに割り当てることができます。

于 2012-11-21T20:36:29.023 に答える
0

独自の自作を使用しているためArrayQueue、これは推測です。

新しいキューを作成して戻ることは、あなたがすでに言っているように、配列に裏打ちされた構造に要素を挿入すると、挿入操作ごとに残りの要素を1つの位置にシャッフルする必要があるため、はるかに簡単で効率的です。

public void mergeQs(ArrayQmerge q)別の方法は、バッキングしている基礎となる配列を交換して実装することです。したがって、新しい Queue を返すのと同じ簡単な実装が得られますが、同じインプレースの副作用があります。

于 2012-11-21T21:39:42.933 に答える