Java のスワップメソッド

K. Macharia 2023年10月12日
  1. Java リスト内の 2つの要素を swap メソッドで交換する
  2. Java 文字列の中の 2つの文字を交換する
  3. Java で 2つのオブジェクトをスワップ
Java のスワップメソッド

Java で 2つの要素、文字、オブジェクトの位置を交換するには、swap() メソッドを使用します。このメソッドはリスト、文字列、オブジェクトに適用することができます。この記事では、swap() メソッドの使用方法について説明します。

  1. リスト内の 2つの要素を入れ替える
  2. 文字列内の 2つの文字を入れ替える
  3. 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つのオブジェクト house1house2 を作成しましょう。House には、value という属性が 1つしかありません。目的は、house1house2 のデータを入れ替えることです。

コード例。

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() メソッドを適用する際には、オブジェクトの属性数に応じて利用するアプローチを選択することができます。

関連記事 - Java String