Javaコレクションアルゴリズム完全ガイド:ソート、シャッフル、検索など
Javaアルゴリズム
JavaのCollectionsフレームワークが提供する強力なアルゴリズムを、明確な実践例で探求します。
Java Collectionsフレームワークは、ジェネリックアルゴリズムと呼ばれる豊富なstaticメソッドを提供し、ボイラープレートコードを書かずにデータ構造を操作できます。これらのユーティリティはCollectionインターフェースを実装するあらゆるコレクションで動作し、シンプルさとパフォーマンスを両立します。
1. Collections.sort()によるソート
sort()メソッドは要素を自然順序(昇順)で並べ替えます。カスタム順序が必要な場合はComparator実装を指定します。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(4);
numbers.add(2);
numbers.add(3);
System.out.println("ソート前: " + numbers);
Collections.sort(numbers);
System.out.println("ソート後: " + numbers);
}
}
出力
ソート前: [4, 2, 3] ソート後: [2, 3, 4]
降順やドメイン固有の基準でソートするにはカスタムComparatorを使用します。
2. Collections.shuffle()によるランダム化
shuffle()で要素の順序をランダム化します。ゲームやサンプリングに最適です。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("ソート済み: " + numbers);
Collections.shuffle(numbers);
System.out.println("シャッフル後: " + numbers);
}
}
出力
ソート済み: [1, 2, 3] シャッフル後: [2, 1, 3]
フィッシャー・イェーツアルゴリズムにより、実行ごとに異なる順列が生成されます。
3. 定型データ操作
コレクションを変換するユーティリティメソッド群:
reverse()– 要素順序を反転fill()– すべての要素を指定値で置換copy()– 同じサイズのコレクション間で要素をコピーswap()– インデックス指定で2要素を交換addAll()– あるコレクションの全要素を別コレクションに追加
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
System.out.println("ArrayList1: " + numbers);
Collections.reverse(numbers);
System.out.println("反転後: " + numbers);
Collections.swap(numbers, 0, 1);
System.out.println("swap後: " + numbers);
ArrayList<Integer> newNumbers = new ArrayList<>();
newNumbers.addAll(numbers);
System.out.println("addAll後: " + newNumbers);
Collections.fill(numbers, 0);
System.out.println("fill後: " + numbers);
Collections.copy(newNumbers, numbers);
System.out.println("copy後: " + newNumbers);
}
}
出力
ArrayList1: [1, 2] 反転後: [2, 1] swap後: [1, 2] addAll後: [1, 2] fill後: [0, 0] copy後: [0, 0]
注意: copy()メソッドは、コピー先コレクションがコピー元以上のサイズを持つ必要があります。
4. Collections.binarySearch()による二分探索
ソート済みコレクションで効率的に要素を検索。要素が見つかればインデックス、見つからなければ負の挿入ポイントを返します。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
int pos = Collections.binarySearch(numbers, 3);
System.out.println("3の位置: " + pos);
}
}
出力
3の位置: 2
ヒント: binarySearch()呼び出し前に必ずコレクションをソートしてください。そうでないと結果は未定義になります。
5. コレクションの構成分析
コレクション間の関係を分析するユーティリティ:
frequency()– 特定要素の出現回数をカウントdisjoint()– 2つのコレクションが共通要素を持たないか判定
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(2);
System.out.println("ArrayList1: " + numbers);
int count = Collections.frequency(numbers, 2);
System.out.println("2の出現回数: " + count);
ArrayList<Integer> newNumbers = new ArrayList<>();
newNumbers.add(5);
newNumbers.add(6);
System.out.println("ArrayList2: " + newNumbers);
boolean disjoint = Collections.disjoint(numbers, newNumbers);
System.out.println("共通要素なし: " + disjoint);
}
}
出力
ArrayList1: [1, 2, 3, 2] 2の出現回数: 2 ArrayList2: [5, 6] 共通要素なし: true
6. 最小値・最大値の検索
min()とmax()で最小・最大要素を取得。分析や境界チェックに有用です。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
int min = Collections.min(numbers);
System.out.println("最小要素: " + min);
int max = Collections.max(numbers);
System.out.println("最大要素: " + max);
}
}
出力
最小要素: 1 最大要素: 3
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java 乱数生成:Random クラスと Math.random 実践ガイド