オブジェクトの交換は、プログラミングで最も一般的なアクションの 1 つです。特に並べ替えに便利です。スワップでは、2 つの変数の値が交換されます。この記事では、2 つの異なるケースで Java でオブジェクトを交換する方法を学びます。1 つは独立したオブジェクトを交換するもので、もう 1 つはリストまたは配列内の 2 つのオブジェクトを交換するものです。まず、独立したオブジェクトの交換について調べてみましょう。
スワップはありませんでした。swap メソッドを呼び出してオブジェクトを渡すと、すべてのプロパティ値を含むオブジェクトのコピーが渡されます。これが「値渡し」と呼ばれる理由です。swap メソッドは実際にオブジェクトを交換し、元のオブジェクトのコピーのみに影響を与えます。したがって、元のオブジェクトは変更されずに維持されます。これを解決するには、ラッパー クラスを使用して 2 つのオブジェクトをラップします。

オブジェクトの交換は、プリミティブ データ型の交換とは異なります。
プリミティブ値を交換するために使用される一般的な方法の 1 つは、時間変数を使用することです。ただし、Java ではメソッドにパラメータを渡すときに「値による受け渡し」を使用することはご存知でしょう。したがって、この方法ではオブジェクトの交換は期待どおりに機能しません。次の例でそれを示します。
public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
swap(obj1, obj2);
System.out.println("Obj1 ID value : " + obj1.id + "\n" + "Obj2 ID value : " + obj2.id);
}
static void swap(InnerClass x, InnerClass y) {
InnerClass temp;
temp = x;
x = y;
y = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
this.id = Id;
}
}
}
出力:
ラッパークラスとオブジェクトを交換する
public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
objectWrapper wrapperObj1 = new objectWrapper(obj1);
objectWrapper wrapperObj2 = new objectWrapper(obj2);
// Values before swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id + "\n");
swap(wrapperObj1, wrapperObj2);
// Values after swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id);
}
static void swap(objectWrapper wrapperObj1, objectWrapper wrapperObj2) {
InnerClass temp;
temp = wrapperObj1.innerObject;
wrapperObj1.innerObject = wrapperObj2.innerObject;
wrapperObj2.innerObject = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
id = Id;
}
}
static class objectWrapper {
InnerClass innerObject;
public objectWrapper(InnerClass objInnner) {
this.innerObject = objInnner;
}
}
}
ここでは、交換する必要があるオブジェクトのタイプのプロパティを持つラッパー クラスを使用しました。単純な swap メソッドを使用して、ラッパー クラス オブジェクトの InnerClass オブジェクトの内容を交換します。スワップされた InnerClass オブジェクトをさらに実装するには、wrapperObj1.xyz および WrapperObj2.xyz を適宜使用できます。出力:
Java の組み込み swap() メソッド
Java Collections Framework のクラスには、 swap()と呼ばれる要素を交換するための組み込みメソッドがあります。java.utilは、Collection インターフェイスのリストなどの要素を操作できる静的メソッドを含むユーティリティ クラスです。swap メソッドの使用は、前に説明した例よりもはるかに簡単です。swap ()メソッドは静的メソッドであるため、Collections.swap()というクラス名を使用して呼び出します。swap()メソッドの戻り値の型はvoid であるため、何も返しません。swap()メソッドに 3 つの引数を渡す必要があります。以下の注意事項をご確認ください。
swap(List<?> list, int a, int b)
パラメーター:
- list — list には交換する要素が含まれます。
- a —交換される要素のインデックス。
- b —交換される別の要素のインデックス。
ArrayList の swap() メソッド
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListSwapper {
public static void main(String[] args) {
try {
List fruits = new ArrayList();
fruits.add("Mango");
fruits.add("Papaya");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Watermelon");
fruits.add("Bael");
System.out.println("Before swapping : " + fruits);
//using Collection.swap() method
Collections.swap(fruits, 2, 5);
System.out.println("After swapping : " + fruits);
} catch (IndexOutOfBoundsException e) {
System.out.println("Index Out of Bound Exception thrown : " + e);
}
}
}
フルーツの ArrayList には 6 つの要素が含まれます。関数 swap()メソッドを使用して、2番目と 5番目の要素を交換します。実行時に IndexOutOfBoundsException をスローする可能性があるため、ベスト プラクティスは、swap()メソッドを try-catch ブロック内に記述することです。出力: '2' と '8' をインデックスとして渡すと、リストのサイズが 6 であるため、アプリケーションは例外をスローします。 
Collections.swap(fruits, 2, 8);
出力は次のようになります。
GO TO FULL VERSION