技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Javaで配列中の最大値と2番目に大きい値を取得する。

Javaで、配列中の最大値を取得するメソッドと、2番目に大きい値を取得するメソッドを作成した。Javaにはこれらをする標準メソッドがないようなので、競プロの問題を解く時の時間短縮のため自作した。

    // 配列の中の最大値を求める
    int getMax (int[] array) {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException("Input array is null or empty.");
        }
        int max = array[0];
        for (int number : array) {
            if (number > max) {
                max = number;
            }
        }
        return max;
    }

    // 配列の中で2番目に大きい数を求める
    int getSecondMax (int[] array) {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException("Input array is null or empty.");
        }
        if (array.length == 1) {
            throw new IllegalArgumentException("Input array has only one element, so can't get second max.");
        }

        // Arrays.sort() を使うと、引数で受け取った配列を並び替えてしまうので(副作用があるので)、ここで配列を複製している。
        // 配列の複製は Arrays.copyOf(array, array.length) でも可。
        int[] workArray = array.clone();
        Arrays.sort(workArray);
        for (int i = array.length - 1; i > 0; i--) {
            if (workArray[i] != workArray[i - 1]) {
                return workArray[i - 1];
            }
        }
        // 配列の値が全て同じ場合、ここに来る。二番目に大きい値は返せず、それは入力の配列が適さないものであること
        // によるものであるため、IllegalArgumentException を投げる。
        throw new IllegalArgumentException("Input array has only same values, so can't get second max.");
    }

とりあえず、int 型の配列に対するメソッドを作成した。問題に応じて、long 型や double 型に書き換えて使用する。
そういえば、この辺りは Javaジェネリクスを使えば同じコードでカバーできるのだろうか・・? いや、プリミティブ型の配列なのでできないような。。あとで確認する。