C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】Stack.Clone()メソッドでスタックの浅いコピーを作成する方法

C#のStack.Clone()メソッドは、既存のStackオブジェクトの浅いコピー(シャローコピー)を作成するために使用されます。このメソッドは、元のスタックと同じ要素を持つ新しいStackインスタンスを返します。戻り値はobject型であるため、実際に使用する際にはStack型へのキャストが必要です。

構文

Clone()メソッドの構文は以下の通りです。

public virtual object Clone ();

このメソッドには引数はありません。戻り値として、元のStackの浅いコピーであるobject型の値が返されます。なお、浅いコピーの場合、要素自体は新しく複製されず、参照が共有される点に注意してください。

例1:整数型のStackをクローンする

まず、整数を格納したStackをClone()メソッドで複製する例を見てみましょう。

using System;
using System.Collections;
public class Demo {
    public static void Main(){
        Stack stack = new Stack();
        stack.Push(150);
        stack.Push(300);
        stack.Push(500);
        stack.Push(750);
        stack.Push(1000);
        stack.Push(1250);
        stack.Push(1500);
        stack.Push(2000);
        stack.Push(2500);
        Console.WriteLine("スタックの要素...");
        foreach(int val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("要素数 = " + stack.Count);
        stack.Push(3000);
        stack.Push(3500);
        stack.Push(4000);
        Console.WriteLine("\n更新後のスタックの要素...");
        foreach(int val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("\n更新後の要素数 = " + stack.Count);
        Stack stack2 = (Stack)stack.Clone();
        Console.WriteLine("\nクローンされたスタックの要素...");
        foreach(int val in stack2){
            Console.WriteLine(val);
        }
        Console.Write("クローンされたスタックの要素数 = " + stack2.Count);
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

スタックの要素...
2500
2000
1500
1250
1000
750
500
300
150
要素数 = 9
更新後のスタックの要素...
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
更新後の要素数 = 12
クローンされたスタックの要素...
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
クローンされたスタックの要素数 = 12

この例では、元のスタックに3つの要素を追加した後にClone()を呼び出しているため、クローンされたスタックにも追加後の12個の要素がすべて含まれていることが確認できます。

例2:文字列型のStackをクローンする

次に、文字列を格納したStackをクローンする別の例を見てみましょう。

using System;
using System.Collections;
public class Demo {
    public static void Main(){
        Stack stack = new Stack();
        stack.Push("Inspiron");
        stack.Push("Alienware");
        stack.Push("Projectors");
        stack.Push("Monitors");
        stack.Push("XPS");
        stack.Push("Laptop");
        stack.Push("Notebook");
        Console.WriteLine("スタックの要素...");
        foreach(string val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("要素数 = " + stack.Count);
        stack.Push("Headphone");
        stack.Push("Keyboard");
        stack.Push("Earphone");
        Console.WriteLine("\n更新後のスタックの要素...");
        foreach(string val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("更新後の要素数 = " + stack.Count);
        Stack stack2 = (Stack)stack.Clone();
        Console.WriteLine("\nクローンされたスタックの要素...");
        foreach(string val in stack2){
            Console.WriteLine(val);
        }
        Console.Write("クローンされたスタックの要素数 = " + stack2.Count);
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

スタックの要素...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
要素数 = 7
更新後のスタックの要素...
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
更新後の要素数 = 10
クローンされたスタックの要素...
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
クローンされたスタックの要素数 = 10

まとめ

Stack.Clone()メソッドを使えば、呼び出し時点での元のスタックの状態をそのまま反映した独立したコピーを簡単に作成できます。ただし、このメソッドによるコピーは「浅いコピー」であるため、参照型の要素が含まれる場合、元のスタックとクローン先のスタックが同じオブジェクトを共有することになります。要素そのものまで完全に複製したい場合は、ディープコピーを独自に実装する必要がある点に留意しましょう。

  1. JavaScriptでスタックの要素を再帰的に並べ替える方法

    はじめに本記事では、整数の配列(スタックとして扱う)を受け取り、再帰処理とpush・popメソッドのみを使って、その配列をその場(in-place)で昇順に並べ替えるJavaScript関数を実装する方法を解説します。このアルゴリズムのポイントは、以下の2つの再帰関数を組み合わせる点にあります。sortStack:スタックから要素を1つずつ取り出し(pop)、残りのスタックを再帰的に並べ替えてから、要素を適切な位置に挿し戻します。sortedInsert:指定した要素を、スタックが空になるか、スタック末尾の要素より大きくなるまで再帰的にpopし、正しい位置に挿入します。サンプルコード実際のコー

  2. HTML DOMのcloneNode()メソッドとは?使い方とサンプルコードを解説

    HTML DOMのcloneNode()メソッドは、呼び出し対象のノードのコピーを作成し、その複製を返すメソッドです。このメソッドを使うことで、指定したノードが持つすべての属性と値をまとめて複製できます。構文cloneNode()メソッドの基本構文は以下の通りです。yourNode.cloneNode([deep])ここで「deep」は省略可能なパラメータです。値に「true」を設定すると、対象ノードだけでなく、その子ノードや属性・値もすべて一緒に複製されます。逆に「false」を設定すると、対象ノード自身とその属性・値のみがコピーされ、子ノードは複製されません。サンプルコードそれでは、HTM