【プログラミングしてみよう31】JavaのCollectionsクラスでリストを便利に操作する

Java

前回はHttpClientを使ってHTTPリクエストを送る方法を学びました。

今回は「Collectionsユーティリティクラス」について解説します。 java.util.Collections はリストや集合に対してよく使う操作(並べ替え・検索・シャッフルなど)をまとめたユーティリティクラスで、これを使うことでコレクション操作がぐっと楽になります。

Collectionsクラスの基本

Collections クラスはすべてのメソッドが static で定義されているため、インスタンスを作らずにそのまま使えます。使うにはインポートが必要です。

import java.util.Collections;

よく使うメソッドは以下の通りです。

sort()        // リストを昇順に並べ替える
reverse()     // リストの順番を逆にする
shuffle()     // リストをランダムに並べ替える
binarySearch() // ソート済みリストから値を二分探索する
max()         // リストの最大値を返す
min()         // リストの最小値を返す
frequency()   // リスト内の指定した値の出現回数を返す
nCopies()     // 指定した値をn個持つリストを作る
unmodifiableList() // 変更不可のリストを作る

サンプルコード(並べ替え・検索・シャッフル)

ファイル作成

「Java20」フォルダに CollectionsTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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

        System.out.println("元のリスト: " + numbers);

        // 昇順に並べ替え
        Collections.sort(numbers);
        System.out.println("sort後: " + numbers);

        // 逆順にする
        Collections.reverse(numbers);
        System.out.println("reverse後: " + numbers);

        // 再度ソートしてから二分探索
        Collections.sort(numbers);
        int index = Collections.binarySearch(numbers, 5);
        System.out.println("5のインデックス: " + index);

        // シャッフル
        Collections.shuffle(numbers);
        System.out.println("shuffle後: " + numbers);

        // 文字列リストのソート
        List<String> names = new ArrayList<>();
        names.add("ぱんまる");
        names.add("たろう");
        names.add("はなこ");
        names.add("あいこ");

        System.out.println("\n元の名前リスト: " + names);
        Collections.sort(names);
        System.out.println("sort後: " + names);
    }
}

コンパイル

javac CollectionsTest.java

実行

java CollectionsTest

実行結果は次のようになります(shuffle後は毎回異なります)。

元のリスト: [5, 2, 8, 1, 9, 3]
sort後: [1, 2, 3, 5, 8, 9]
reverse後: [9, 8, 5, 3, 2, 1]
5のインデックス: 3
shuffle後: [9, 1, 3, 2, 8, 5]

元の名前リスト: [ぱんまる, たろう, はなこ, あいこ]
sort後: [あいこ, たろう, はなこ, ぱんまる]

サンプルコード(最大値・最小値・頻度)

ファイル作成

「Java20」フォルダに CollectionsTest2.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsTest2 {
    public static void main(String[] args) {
        List<Integer> scores = new ArrayList<>();
        scores.add(80);
        scores.add(65);
        scores.add(90);
        scores.add(65);
        scores.add(72);
        scores.add(65);

        // 最大値・最小値
        System.out.println("最大値: " + Collections.max(scores));
        System.out.println("最小値: " + Collections.min(scores));

        // 特定の値の出現回数
        System.out.println("65の出現回数: " + Collections.frequency(scores, 65));

        // 同じ値をn個持つリストを作る
        List<String> filledList = Collections.nCopies(5, "Java");
        System.out.println("\nnCopies: " + filledList);

        // 変更不可のリストを作る
        List<String> languages = new ArrayList<>();
        languages.add("Java");
        languages.add("Python");
        languages.add("Kotlin");

        List<String> unmodifiable = Collections.unmodifiableList(languages);
        System.out.println("unmodifiableList: " + unmodifiable);

        try {
            unmodifiable.add("Ruby"); // 変更しようとすると例外が発生
        } catch (UnsupportedOperationException e) {
            System.out.println("エラー: 変更不可のリストには追加できません");
        }
    }
}

コンパイル

javac CollectionsTest2.java

実行

java CollectionsTest2

実行結果は次のようになります。

最大値: 90
最小値: 65
65の出現回数: 3

nCopies: [Java, Java, Java, Java, Java]
unmodifiableList: [Java, Python, Kotlin]
エラー: 変更不可のリストには追加できません

コードの解説

Collections.sort(numbers) はリストを昇順に並べ替えます。数値なら数値順、文字列なら辞書順(アルファベット・五十音順)で並べ替えます。Collections.reverse(numbers) は要素の順番をそのまま逆にします。sort してから reverse すると降順になります。

Collections.binarySearch(list, key) はソート済みのリストを二分探索し、見つかった要素のインデックスを返します。必ずソート済みのリストに対して使う必要があり、ソートせずに使うと正しい結果が得られません。

Collections.shuffle(numbers) はリストの要素をランダムに並べ替えます。カードゲームや抽選プログラムなどに活用できます。

Collections.max()Collections.min() はリストの最大値・最小値を返します。前回学んだStream APIの stream().max()stream().min() でも同じことができますが、Collections を使う方がシンプルに書けます。

Collections.frequency(list, value) は指定した値がリストに何回含まれているかを返します。前回学んだHashMapでカウントする方法と比べて、1つの値の出現回数を調べるだけなら frequency の方が手軽です。

Collections.unmodifiableList(list) は変更不可のリストを返します。追加・削除・変更を試みると UnsupportedOperationException が発生します。外部に公開したくないリストを守るために使われます。

まとめ

Collections クラスのユーティリティメソッドを使うことで、リストの並べ替え・逆順・シャッフル・検索・最大最小・出現回数の確認などがワンライナーで書けるようになります。自分でループを組んで実装する必要がなく、コードが短くなるだけでなく読みやすくなります。sortbinarySearch はセットで、unmodifiableList は外部公開するコレクションに対して使うという点を覚えておきましょう。これまで学んだArrayListやSetと組み合わせてぜひ活用してみてください。

2026/07/10(金) ぱんまる

コメント

タイトルとURLをコピーしました