Java のスワップメソッド
Java で 2つの要素、文字、オブジェクトの位置を交換するには、swap()
メソッドを使用します。このメソッドはリスト、文字列、オブジェクトに適用することができます。この記事では、swap()
メソッドの使用方法について説明します。
- リスト内の 2つの要素を入れ替える
- 文字列内の 2つの文字を入れ替える
- 2つのオブジェクトを入れ替える
Java リスト内の 2つの要素を swap
メソッドで交換する
これは、リスト内の他の要素に影響を与えることなく、定義された位置にある 2つの特定の要素を交換するために使用されるメソッドです。指定したインデックスのいずれかがリストのサイズよりも大きい場合、このメソッドは out of bound
例外を返します。swap()
は、交換されたインデックスの要素をリストに出力します。
構文:
public static void swap(List mylist, int m, int n)
すなわち、swap()
メソッドが適用されるリストと、交換される 2つのインデックスです。
コード例:
import java.util.ArrayList;
import java.util.Collections;
public class PerformSwap {
public static void main(String[] args) {
ArrayList<String> lettersList = new ArrayList<String>();
lettersList.add("a");
lettersList.add("b");
lettersList.add("c");
lettersList.add("d");
lettersList.add("e");
lettersList.add("f");
lettersList.add("g");
System.out.println("Original List: " + lettersList);
Collections.swap(lettersList, 0, 6);
System.out.println("\nSwapped List: " + lettersList);
}
}
出力:
Original List: [a, b, c, d, e, f, g]
Swapped List: [g, b, c, d, e, f, a]
上の例では、インデックス 6 の文字 g
とインデックス 0
の文字 a
を交換しています。swap
メソッドは、他のリスト要素に干渉することなく、この 2つの文字を交換しただけです。
Java 文字列の中の 2つの文字を交換する
文字列値の主な特性の 1つは、不変であること、つまり変更できないことです。スワップ操作を行うには、まず String
オブジェクトを StringBuilder
または文字配列にコピーする必要があります。これら 2つのデータ型により、コピーしたオブジェクトに対してスワップ操作を行うことができます。以下では、char 配列と StringBuilder
を使ってスワップ操作を行い、スワップされた文字を含む新しい文字列を作成します。
Java で文字列配列を使った文字列スワップを実行する
スワップメソッドには 3つのパラメータがあります。スワップを実行する文字列と、交換する文字の 2つのインデックスです。文字のスワップを実行するには、まず一時的な文字ストレージオブジェクト tempo
を作成します。この一時オブジェクトは最初の文字を 2 番目の文字に置き換えて保存し、この文字を 2 番目の文字に渡して交換処理を完了させます。
これには 3つのステップがあります。
-
文字列を文字列配列オブジェクトに変換する
-
オブジェクトの長さを取得します。
-
char
配列のインデックスを入れ替える
コード例:
public class SwapString {
static char[] swap(String mystring, int i, int j) {
char ch[] = mystring.toCharArray();
char tempo = ch[i];
ch[i] = ch[j];
ch[j] = tempo;
return ch;
}
public static void main(String args[]) {
String theS = "Favourite";
System.out.println(swap(theS, 5, 2));
System.out.println(swap(theS, 0, theS.length() - 1));
System.out.println(theS);
}
}
出力:
Farouvite
eavouritF
Favourite
Java で StringBuilder を使用して文字列スワップの実行
コード例:
public class SwapString {
static String swap(String mystring, int i, int j) {
StringBuilder mysb = new StringBuilder(mystring);
mysb.setCharAt(i, mystring.charAt(j));
mysb.setCharAt(j, mystring.charAt(i));
return mysb.toString();
}
public static void main(String args[]) {
String theS = "Favorite";
System.out.println(swap(theS, 5, 2));
System.out.println(swap(theS, 0, theS.length() - 1));
// Original String
System.out.println(theS);
}
}
出力:
Faiorvte
eavoritF
Favorite
Java で 2つのオブジェクトをスワップ
また、swap
メソッドを用いて、2つのオブジェクトの属性を入れ替えることもできます。オブジェクトのスワップは、1つの属性を持つオブジェクトに対しても、複数の属性を持つオブジェクトに対しても行うことができます。
一つの属性を持つオブジェクトのスワップ
例えば、寝室の数やバスルームの数などの属性を持つ House
というクラスがあるとしよう。ここでは、House
の 2つのオブジェクト house1
と house2
を作成しましょう。House
には、value
という属性が 1つしかありません。目的は、house1
と house2
のデータを入れ替えることです。
コード例。
public class SwapObjects {
public static void swap(House house1, House house2) {
House temp = house1;
house1 = house2;
house2 = temp;
}
public static void main(String[] args) {
House house1 = new House();
House house2 = new House();
house1.value = 5;
house2.value = 2;
// swap using objects
swap(house1, house2);
System.out.println(house1.value + ", " + house2.value);
}
}
class House {
public int value;
}
出力:
5, 2
Java で複数の属性を持つオブジェクトをスワップする
複数の属性を持つ 2つのオブジェクトの属性をスワップするには、Wrapper
クラスを使います。wrapper クラスを使わずにスワップを実行すると、関数スワップはオブジェクト参照のコピーを作成するだけです。
public class SwapObjects {
public static void main(String[] args) {
House house1 = new House(5, 3);
House house2 = new House(2, 1);
Wrapper whs1 = new Wrapper(house1);
Wrapper whs2 = new Wrapper(house2);
// swap using wrapper of objects
swap(whs1, whs2);
whs1.house.print();
whs2.house.print();
}
public static void swap(Wrapper whs1, Wrapper whs2) {
House temp = whs1.house;
whs1.house = whs2.house;
whs2.house = temp;
}
}
class House {
int bedroom, bathroom;
// Constructor
House(int bedroom, int bathroom) {
this.bedroom = bedroom;
this.bathroom = bathroom;
}
// Utility method to print object details
void print() {
System.out.println("bedrooms = " + bedroom + ", bathrooms = " + bathroom);
}
}
class Wrapper {
House house;
Wrapper(House house) {
this.house = house;
}
}
出力:
bedrooms = 2, bathrooms = 1
bedrooms = 5, bathrooms = 3
ラッパークラスは、メンバーのクラスがユーザクラスにアクセスできなくても、オブジェクトをスワップします。オブジェクトに swap()
メソッドを適用する際には、オブジェクトの属性数に応じて利用するアプローチを選択することができます。