工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

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. 定型データ操作

コレクションを変換するユーティリティメソッド群:

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. コレクションの構成分析

コレクション間の関係を分析するユーティリティ:

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

  1. Java演算子をマスター:種類、構文、実践例
  2. Javaコメント:種類、使い方、ベストプラクティス
  3. Java if…elseをマスター:制御フローを徹底解説
  4. Java拡張forループをマスター:構文、例、ベストプラクティス
  5. Java文字列をマスター:生成、メソッド、ベストプラクティス
  6. Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
  7. Java無名インナークラス完全ガイド:定義、構文、実践例
  8. Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
  9. Javaアノテーション完全ガイド:種類、配置場所、実践例
  10. Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
  11. Java 乱数生成:Random クラスと Math.random 実践ガイド