はじめに
仕事でJavaを触る機会がすっかり無くなってきたので、Javaを使って様々な方法で「Fizz Buzz問題」を解く方法を考えてみました。
Fizz Buzzとは
- 英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びのこと。
- 最初のプレイヤーは「1」と数字を読み上げる。
- 以降のプレイヤーは、次の数字を読み上げる。
- ただし、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、3と5の両方で割り切れる場合は「Fizz Buzz」と発言する。
For文を用いた一般的な方法
FizzBuzz.java
/**
* for文を使った一般的な方法。
* @param end FizzBuzzを終える数。
*/
public static void useForLoop(int end) {
for (int i=1; i<=end; i++) {
if (i%3==0 && i%5==0) {
System.out.println("Fizz Buzz");
} else if (i%3==0) {
System.out.println("Fizz");
} else if (i%5==0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
For文+三項演算子を用いた方法
FizzBuzz.java
/**
* 三項演算子を活用した方法。
* @param end FizzBuzzを終える数。
*/
public static void useForLoopWithTertiaryOperator(int end) {
for (int i=1; i<=end; i++) {
System.out.println(
(i%3==0 && i%5==0) ? "Fizz Buzz" : (i%3==0) ? "Fizz" : (i%5==0) ? "Buzz" : i
);
}
}
Stream APIを用いた方法
FizzBuzz.java
import java.util.stream.IntStream;
...
/**
* Stream APIを活用した方法。
* @param end FizzBuzzを終える数。
*/
public static void useStreamAPI(int end) {
IntStream.rangeClosed(1, end)
.mapToObj(i -> (i%3==0 && i%5==0) ? "Fizz Buzz" : (i%3==0) ? "Fizz" : (i%5==0) ? "Buzz" : i)
.forEach(msg -> System.out.println(msg));
}
まとめ
- 一番古臭い書き方である「For文を用いた一般的な方法」が、一番見やすく理解しやすい感じ。
- 三項演算子を重ねると、どうしても見づらくなってしまうのが難点。
- Java Silver SE 8の試験では、「多重の三項演算子」に関する問題が出てきましたが、実際に使おうとすると可読性に問題があると改めて感じました。
- ちょっとした頭の体操をしつつ、さらにStream APIの復習になって一石二鳥。
- 最近は業務でJavaから離れているので、Stream APIを触る機会もどんどん減っている気が...
- 少し前に調べた、rangeClosedメソッドの情報も役立ちました。