Java で 3 番目に小さい数値を見つける: 完全ガイド

公開: 2023-08-23

配列、リスト、または整数のストリーム内で 3 番目に小さい数値を効率的に見つける方法を考えたことはありますか? このブログ投稿では、Java プログラミングの世界に飛び込み、さまざまなデータ ソースで 3 番目に小さい数値を特定するためのさまざまなテクニックを探っていきます。

Java で 3 番目に小さい数値を見つける - 包括的なガイド

データの操作や分析を行う場合、数値の集合内の特定の要素を識別する必要が生じることがよくあります。 最小または最大の数値を見つけるのは比較的簡単ですが、3 番目に小さい数値を決定するには、もう少し細かい操作が必要です。 このブログ投稿では、Java を使用してこの問題に対処するための 3 つの方法 (配列の並べ替え、リストの並べ替え、ストリームの利用) について説明します。

方法 1: 配列を並べ替える

配列は Java の基本的なデータ構造の 1 つであり、探索の自然な開始点となります。 ここでの考え方は、配列を昇順に並べ替えて、インデックス 2 の要素を取得することです。

方法 2: リストを並べ替える

リストは配列に代わるより柔軟な手段を提供し、動的なサイズ変更と簡単な操作を可能にします。 リスト内で 3 番目に小さい数値を見つけるには、配列の並べ替えと同様のアプローチに従うことができます。

方法 3: ストリームを利用する

Java ストリームは、要素のシーケンスを処理する強力な方法です。 ストリームを使用して要素を並べ替え、3 番目に小さい数値を取得できます。

適切な方法の選択

各方法には独自の利点と使用例があります。 手元に配列がある場合は、配列のソート方法が最も効率的である可能性があります。 リストは多用途で利便性が高く、ストリームは機能的なアプローチを提供し、より大きなデータセットを簡単に処理できます。

完全な例を次に示します。

CrunchyThirdSmallestNumberFinder.java

 パッケージ crunchify.com.tutorial;

java.util.Arrays をインポートします。
java.util.Listをインポートします。
java.util.stream.Collectorsをインポートします。
java.util.stream.Streamをインポートします。

/**
 * @author Crunchify.com
 * Java で 3 番目に小さい数値を見つける: 包括的なガイド
 *
 */

パブリック クラス CrunchyThirdSmallestNumberFinder {

    // 配列内で 3 番目に小さい数値を正確に見つけるメソッド
    public static int findCrunchyThirdSmallest(int[] crunchArr) {
        if (crunchArr.length < 3) {
            throw new IllegalArgumentException("配列には少なくとも 3 つのクランチ要素が含まれている必要があります");
        }

        // Crunchy 配列を昇順にソートします
        Arrays.sort(crunchArr);
        crunchArr[2]を返します; // 3 番目に小さいクランチ要素を返します
    }

    // リスト内で 3 番目に小さい数値を正確に見つけるメソッド
    public static int findCrunchyThirdSmallest(List<Integer> crunchList) {
        if (crunchList.size() < 3) {
            throw new IllegalArgumentException("リストには少なくとも 3 つのクランチ要素が含まれている必要があります");
        }

        // ストリームを使用してカリカリリストをソートし、ソートされた要素を新しいリストに収集します
        List<Integer>sortedCrunchList = crunchList.stream()
                .sorted()
                .collect(Collectors.toList());

        戻りsortedCrunchList.get(2); // 3 番目に小さいクランチ要素を返します
    }

    // ストリーム内で 3 番目に小さい数値を正確に見つけるメソッド
    public static int findCrunchyThirdSmallest(Stream<Integer> crunchStream) {
        // Crunchy ストリームから要素を収集し、並べ替えて、リストにまとめます
        List<Integer>sortedCrunchList = crunchStream.sorted().collect(Collectors.toList());

        if (sortedCrunchList.size() < 3) {
            throw new IllegalArgumentException("ストリームには少なくとも 3 つのクランチ要素が含まれている必要があります");
        }

        戻りsortedCrunchList.get(2); // 3 番目に小さいクランチ要素を返します
    }

    public static void main(String[] args) {
        int[] crunchArr = {35, 62, 28, 31, 13, 97};
        List<Integer> crunchList = Arrays.asList(9, 14, 676, 62, 11, 328);
        Stream<Integer> crunchStream = Stream.of(427, 53, 71, 99, 25, 62);

        // さまざまなソースを使用して、3 番目に小さい数値を正確に見つけます
        int crunchyThirdSmallestFromArr = findCrunchyThirdSmallest(crunchArr);
        int crunchyThirdSmallestFromList = findCrunchyThirdSmallest(crunchList);
        int crunchyThirdSmallestFromStream = findCrunchyThirdSmallest(crunchStream);

        // 3 番目に小さい数値を正確に出力します
        System.out.println("arr から 3 番目に小さいクランチ: " + crunchyThirdSmallestFromArr);
        System.out.println("リストから 3 番目に小さいザクザク: " + crunchyThirdSmallestFromList);
        System.out.println("ストリームからのクランチ 3 番目に小さいもの: " + crunchyThirdSmallestFromStream);
    }
}

Eclipse コンソールの結果:

上記のプログラムを Eclipse IDE または IntelliJ IDEA で実行すると、次のような結果が得られます。

 カリカリ arr: 31 から 3 番目に小さい
リスト内で 3 番目に小さいクランチ: 14
サクサク ストリームから 3 番目に小さい: 62

プロセスは終了コード 0 で終了しました

考慮すべきパフォーマンスの違いがいくつかあります。

時間計算量の観点から見ると、3 つの方法はすべて同様の並べ替え手順を持ち、一般にO(n log n)の時間計算量を持ちます。ここで、「n」はコレクション (配列、リスト、またはストリーム) 内の要素の数です。

3 番目に小さい要素にアクセスする時間計算量は一定で、 O(1)です。これは、単純な配列またはリストの検索であるためです。

  1. 配列メソッド:このメソッドは配列を所定の位置でソートするため、新しくソートされたコレクションのために追加のメモリを必要としません。 これにより、リスト メソッドやストリーム メソッドと比べてメモリ使用量がわずかに向上する可能性があります。
  2. List メソッド:このメソッドは、ストリームを使用してリストをソートされたリストに変換します。 便利ではありますが、新しいリストを作成する必要があるため、追加のメモリを消費します。 メモリ使用量が重要な場合、これが問題になる可能性があります。
  3. ストリーム メソッド:ストリーム メソッドは非常に柔軟で機能的ですが、ストリームをリストに収集する必要があります。 これにより、配列を直接ソートする場合と比較して、メモリと処理の点でわずかなオーバーヘッドが追加されます。

このコードの実行中に問題が発生した場合はお知らせください。