はじめに
Java では、プリミティブデータ型を交換することは簡単で、単純な変数代入で行うことができます。ただし、オブジェクトなどの非プリミティブデータ型を交換することは複雑になる場合があります。幸いなことに、java.util.Collections クラスには swap() メソッドがあり、これを使うとプリミティブ型と非プリミティブ型のデータのリスト内の要素を交換することが簡単になります。この実験では、Collections.swap() メソッドを使って交換関数を作成する方法を学びます。
Java ファイルを作成する
まず、~/project ディレクトリに SwapFunction.java という名前の Java ファイルを作成します。
touch ~/project/SwapFunction.java
java.util ライブラリをインポートする
Java ファイルで Collections クラスを使用するために、java.util ライブラリをインポートします。
import java.util.*;
任意のデータ型のリストを受け取る関数を宣言する
任意のデータ型のリストを受け取る関数を宣言します。Java のジェネリクス機能を使ってデータ型を指定できます。この例では、String オブジェクトの ArrayList を受け取り、指定されたインデックスの 2 つの要素を交換する swapElements という名前の関数を作成します。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
// swap code goes here
}
}
Collections.swap() メソッドを使ってスワップ関数を実装する
swapElements 関数では、指定されたインデックスの要素を交換するために Collections.swap() メソッドを使用します。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
Collections.swap(list, index1, index2);
}
}
スワップ関数をテストする
String オブジェクトの ArrayList を作成し、いくつかの要素を追加してから 2 つの要素を交換することで、swapElements 関数をテストします。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
Collections.swap(list, index1, index2);
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "orange", "kiwi"));
System.out.println("交換前:" + list);
swapElements(list, 0, 2);
System.out.println("交換後:" + list);
}
}
Java ファイルを保存した後、コンパイルして実行します。
javac ~/project/SwapFunction.java && java SwapFunction
以下の出力が表示されるはずです。
交換前: [apple, banana, orange, kiwi]
交換後: [orange, banana, apple, kiwi]
リスト内の複数の要素をスワップする
swapElements 関数は、Collections.swap() メソッドを複数回呼び出すことで、リスト内の複数の要素を交換するためにも使用できます。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
Collections.swap(list, index1, index2);
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "orange", "kiwi"));
System.out.println("交換前:" + list);
swapElements(list, 0, 3);
swapElements(list, 1, 2);
System.out.println("交換後:" + list);
}
}
Java ファイルを保存した後、コンパイルして実行します。
javac ~/project/SwapFunction.java && java SwapFunction
以下の出力が表示されるはずです。
交換前: [apple, banana, orange, kiwi]
交換後: [kiwi, orange, banana, apple]
例外を処理する
指定されたインデックスがリストの範囲外の場合、swapElements 関数は IndexOutOfBoundsException 例外をスローします。これを処理するには、関数に try-catch ブロックを追加します。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
try {
Collections.swap(list, index1, index2);
} catch (IndexOutOfBoundsException e) {
System.out.println("エラー: " + e.getMessage());
}
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "orange", "kiwi"));
System.out.println("交換前:" + list);
swapElements(list, 0, 4); // 範囲外のインデックス
swapElements(list, 1, 2);
System.out.println("交換後:" + list);
}
}
Java ファイルを保存した後、コンパイルして実行します。
javac ~/project/SwapFunction.java && java SwapFunction
以下の出力が表示されるはずです。
交換前: [apple, banana, orange, kiwi]
エラー: Index 4 out of bounds for length 4
交換後: [apple, orange, banana, kiwi]
配列内の要素をスワップする
配列をリストに変換することで、swapElements 関数を使って配列内の要素を交換することもできます。
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
try {
Collections.swap(list, index1, index2);
} catch (IndexOutOfBoundsException e) {
System.out.println("エラー: " + e.getMessage());
}
}
public static void main(String[] args) {
String[] array = {"apple", "banana", "orange", "kiwi"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(array));
System.out.println("交換前:" + list);
swapElements(list, 0, 3);
swapElements(list, 1, 2);
System.out.println("交換後:" + list);
}
}
Java ファイルを保存した後、コンパイルして実行します。
javac ~/project/SwapFunction.java && java SwapFunction
以下の出力が表示されるはずです。
交換前: [apple, banana, orange, kiwi]
交換後: [kiwi, orange, banana, apple]
カスタムオブジェクトのリスト内の要素をスワップする
swapElements 関数は、カスタム オブジェクトのリスト内の要素を交換するためにも使用できます。name と age フィールドを持つ Person クラスを定義し、その後 Person オブジェクトのリストを作成し、リスト内の 2 つの要素を交換します。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return name + " (" + age + ")";
}
}
public class SwapFunction {
public static <T> void swapElements(ArrayList<T> list, int index1, int index2){
try {
Collections.swap(list, index1, index2);
} catch (IndexOutOfBoundsException e) {
System.out.println("エラー: " + e.getMessage());
}
}
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("Alice", 25));
list.add(new Person("Bob", 30));
list.add(new Person("Charlie", 35));
list.add(new Person("David", 40));
System.out.println("交換前:" + list);
swapElements(list, 0, 3);
swapElements(list, 1, 2);
System.out.println("交換後:" + list);
}
}
Java ファイルを保存した後、コンパイルして実行します。
javac ~/project/SwapFunction.java && java SwapFunction
以下の出力が表示されるはずです。
交換前: [Alice (25), Bob (30), Charlie (35), David (40)]
交換後: [David (40), Charlie (35), Bob (30), Alice (25)]
まとめ
この実験では、Collections.swap() メソッドを使用して Java の swap() 関数を作成する方法を学びました。任意のデータ型のリストを受け取る関数を作成する方法、指定されたインデックスで 2 つの要素を交換するための Collections.swap() メソッドの使い方、および例外を処理する方法を学びました。また、配列内およびカスタム オブジェクトのリスト内の要素を交換する方法も学びました。



