Java アドバンス

Java アルゴリズム

これまでの章では、ArrayListHashMap などのデータ構造を使用して、データを格納・整理する方法を学習しました。

アルゴリズムは、それらのデータ構造内のデータをソート(並べ替え)、検索、および操作することによって問題を解決するために使用されます。

Java では、多くの便利なアルゴリズムが java.util パッケージの Collections クラスにビルトイン(標準搭載)されているため、ゼロからロジックを書き直す必要はありません。

1. 検索(Searching)

リスト内の要素を見つけるために、Java はヘルパーメソッドを提供しています。最も一般的なのは Collections.binarySearch() で、ソート済みのリストに対して検索を行います。

1.1 バイナリサーチの実行例

ソート済みの ArrayList から特定の要素を検索します。

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<>();
    names.add("Liam");
    names.add("Jenny");
    names.add("Kasper");
    names.add("Angie");

    // バイナリサーチの前に必ずソートが必要
    Collections.sort(names); 
    
    int index = Collections.binarySearch(names, "Angie");
    System.out.println("Angie のインデックス: " + index);
  }
}

2. ソート(Sorting)

ソートは最も頻繁に使用されるアルゴリズムの一つです。ArrayList では、Collections.sort() を使用して要素を並べ替えることができます。

2.1 数値リストのソート

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<>();
    numbers.add(5);
    numbers.add(1);
    numbers.add(7);
    numbers.add(3);
    numbers.add(9);

    // 昇順にソート
    Collections.sort(numbers);
    System.out.println(numbers); // [1, 3, 5, 7, 9]
  }
}

2.2 逆順(降順)のソート

Collections.sort(list, Collections.reverseOrder()) を使用することで、降順にソートすることも可能です。

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<>();
    numbers.add(5);
    numbers.add(1);
    numbers.add(7);
    numbers.add(3);
    numbers.add(9);

    // 降順にソート
    Collections.sort(numbers, Collections.reverseOrder());
    System.out.println(numbers); // [9, 7, 5, 3, 1]
  }
}

3. イテレーション(Iterating)

要素を順次走査(ループ)することも一般的なアルゴリズムの一種です。for-each ループまたは Iterator インターフェースを使用します。

3.1 for-each ループを使用した走査

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> colors = new ArrayList<>();
    colors.add("Red");
    colors.add("Green");
    colors.add("Blue");

    for (String c : colors) {
      System.out.println(c);
    }
  }
}

3.2 Iterator を使用した走査

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> colors = new ArrayList<>();
    colors.add("Red");
    colors.add("Green");
    colors.add("Blue");

    Iterator<String> it = colors.iterator();
    while (it.hasNext()) {
      System.out.println(it.next());
    }
  }
}

4. その他の便利なアルゴリズム

Collections クラスには、他にも多くのアルゴリズムが含まれています。

  • Collections.max() - 最大の要素を見つける
  • Collections.min() - 最小の要素を見つける
  • Collections.shuffle() - 要素をランダムにシャッフルする
  • Collections.frequency() - 特定の要素が出現する回数をカウントする
  • Collections.swap() - リスト内の2つの要素を入れ替える

4.1 最大値と最小値の取得例

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<>();
    numbers.add(5);
    numbers.add(1);
    numbers.add(7);
    numbers.add(3);
    numbers.add(9);

    System.out.println("最大値: " + Collections.max(numbers));
    System.out.println("最小値: " + Collections.min(numbers));
  }
}

4.2 要素のシャッフル例

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> cards = new ArrayList<>();
    cards.add("Ace");
    cards.add("King");
    cards.add("Queen");
    cards.add("Jack");

    // 要素をランダムに並べ替える
    Collections.shuffle(cards);
    System.out.println(cards);
  }
}

4.3 要素の出現頻度をカウントする例

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> fruits = new ArrayList<>();
    fruits.add("Apple");
    fruits.add("Banana");
    fruits.add("Orange");
    fruits.add("Banana");
    fruits.add("Mango");

    // "Banana" が何回出現するかカウント
    int count = Collections.frequency(fruits, "Banana");
    System.out.println("Banana の出現回数: " + count + " 回");
  }
}

4.4 要素の入れ替え(スワップ)例

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> fruits = new ArrayList<>();
    fruits.add("Apple");
    fruits.add("Banana");
    fruits.add("Orange");
    fruits.add("Mango");

    // 最初(インデックス0)と3番目(インデックス2)の要素を入れ替える
    Collections.swap(fruits, 0, 2); 
    System.out.println(fruits);
  }
}

5. まとめ

  • アルゴリズムとは、問題を解決するための手順や手続きのことです。
  • Java は Collections クラスに多くのビルトインアルゴリズムを提供しています。
  • 一般的なアルゴリズムには、検索ソート走査(イテレート)、最大値最小値の取得などがあります。
  • アルゴリズムをデータ構造(ArrayListHashSet など)と組み合わせることで、より強力で効率的なプログラムを構築できます。