スワップ関数の作成

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Java では、プリミティブデータ型を交換することは簡単で、単純な変数代入で行うことができます。ただし、オブジェクトなどの非プリミティブデータ型を交換することは複雑になる場合があります。幸いなことに、java.util.Collections クラスには swap() メソッドがあり、これを使うとプリミティブ型と非プリミティブ型のデータのリスト内の要素を交換することが簡単になります。この実験では、Collections.swap() メソッドを使って交換関数を作成する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/packages_api("Packages / API") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("ArrayList") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/generics("Generics") java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/create_write_files("Create/Write Files") subgraph Lab Skills java/arrays_methods -.-> lab-117432{{"スワップ関数の作成"}} java/collections_methods -.-> lab-117432{{"スワップ関数の作成"}} java/classes_objects -.-> lab-117432{{"スワップ関数の作成"}} java/packages_api -.-> lab-117432{{"スワップ関数の作成"}} java/exceptions -.-> lab-117432{{"スワップ関数の作成"}} java/arraylist -.-> lab-117432{{"スワップ関数の作成"}} java/generics -.-> lab-117432{{"スワップ関数の作成"}} java/files -.-> lab-117432{{"スワップ関数の作成"}} java/create_write_files -.-> lab-117432{{"スワップ関数の作成"}} end

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 関数は、カスタム オブジェクトのリスト内の要素を交換するためにも使用できます。nameage フィールドを持つ 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() メソッドの使い方、および例外を処理する方法を学びました。また、配列内およびカスタム オブジェクトのリスト内の要素を交換する方法も学びました。