はじめに
D Rankの問題をただ解くだけだと初心者専用記事になってしまうので、通常の解法とは別に、Stream APIも使って解いてみました。
問題へのリンク
解答コード
通常
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int NUMBER_OF_INPUTS = 5;
int min = Integer.MAX_VALUE;
for (int i = 0; i < NUMBER_OF_INPUTS; i++) {
int input = scanner.nextInt();
min = Math.min(min, input);
}
System.out.println(min);
scanner.close();
}
}
Stream API使用
import java.util.Scanner;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int min = IntStream.range(0, 5)
.map(i -> scanner.nextInt())
.min()
.orElseThrow();
System.out.println(min);
scanner.close();
}
}
解説
通常
最小値を求める場合、minの初期値をどうすればいいかがポイントです。
Integer.MAX_VALUEはintで表現できる最大値を呼び出します。ただ、入力の範囲が1以上100以下の為、100以上であればどんな値でも構いません。A Rank以上だと、入力範囲を見落とすと失敗することがあるので、早めに入力範囲を見る癖をつけておくことをお勧めします。
100未満の値を初期値として設定してしまうと入力値が全て100の場合minが更新されずに失敗します。
値の更新はMath.minメソッドを使うと可読性も上がりますのでお勧めです。引数のうち、小さい値を返してくれます。なるべくライブラリに登録されているメソッドを使う癖をつけておくと、今後Python等のライブラリが最適化されている言語を学ぶ際に少し有利です。
Stream API使用
Stream APIはJava Goldで頻出です。
動きを簡単に説明すると
0 ~ 4の範囲でIntStreamを生成
⇒各要素をscanner.nextInt()で更新
⇒最小値を取得(戻り値がOptionalIntなので注意)
⇒OptionalIntからintを取り出す。(検索結果無しの場合例外)
OptionalIntはintの値、もしくは検索結果無しという結果を内包するコンテナクラスです。
ですのでOptionalと全く異なる為、Optionalと継承関係ではありません。
intはnullがあり得ない型ですので認識を間違えないようにしましょう。
getAsInt()でもintを取り出せます。orElseThrow()よりも検索結果が必ず存在しているというニュアンスが濃くなりますので、今回のケースだとこちらのメソッドでもいいでしょう。
OptionalIntの通常の運用だと、検索結果無しという状況が起こりうるのでorElseThrow()を使用して、より例外を意識させます。