Java アルゴリズム
これまでの章では、ArrayList や HashMap などのデータ構造を使用して、データを格納・整理する方法を学習しました。
アルゴリズムは、それらのデータ構造内のデータをソート(並べ替え)、検索、および操作することによって問題を解決するために使用されます。
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クラスに多くのビルトインアルゴリズムを提供しています。 - 一般的なアルゴリズムには、検索、ソート、走査(イテレート)、最大値・最小値の取得などがあります。
- アルゴリズムをデータ構造(
ArrayList、HashSetなど)と組み合わせることで、より強力で効率的なプログラムを構築できます。