FizzBuzzといえば、英語圏の言葉遊びですが、簡単なプログラミングができるかどうかをテストする問題にもなっています。
JavaでFizzBuzzを実装する方法を、for文とストリームAPIの2パターンでサンプルとともに解説していきます。
また、FizzBuzz問題を解く際のポイントを説明します。
FizzBuzz問題とは?
プログラミングのFizzBuzz問題は以下のルールで値が出力されるように実装する問題です。
- 1から順に値を出力する
- 3で割り切れるときは「Fizz」を出力する
- 5で割り切れるときは「Buzz」を出力する
- 3と5の両方で割り切れるときは「FizzBuzz」を出力する
プログラミングを少しかじっていれば、解ける問題です。
JavaでFizzBuzz問題を解くサンプル
JavaでFizzBuzz問題を解くサンプルが以下です。
非常に基本的なfor文で実装したバージョンと、ストリームAPIを使用して実装したバージョンの2パターンが含まれています。
import java.util.stream.IntStream; public class FizzBuzz { public static void main(String[] args) { forFizzBuzz(); streamFizzBuzz(); } public static void forFizzBuzz() { for (int i = 1; i <= 30; i++) { if (i % 3 == 0 && i % 5 == 0) { System.out.println("FizzBuzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else { System.out.println(i); } } } public static void streamFizzBuzz() { IntStream.rangeClosed(1, 30) .mapToObj(i -> i%3==0 && i%5==0 ? "FizzBuzz" : i%3==0 ? "Fizz" : i%5==0 ? "Buzz" : i) .forEach(System.out::println); } }
基本に忠実に実装する場合は、for文を使用したバージョンになるでしょう。
ストリームAPIと三項演算子を併用すると、1文でシンプルに実装できます。
FizzBuzz問題を解く際のポイント
FizzBuzz問題を解く際にはポイントがあります。
サンプルのようにシンプルに解く場合、処理の順番を意識しないと正しく実装することができません。
3で割り切れる場合、5で割り切れる場合の条件はどちらが先でも問題ありませんが、3と5の両方で割り切れる場合を1番最初に判定しないと正しく実装できません。
仮に3と5の両方で割り切れる場合を、3で割り切れる場合、5で割り切れる場合の後にした場合、15などが3で割り切れる場合にヒットしてしまい正しい結果を表示できないのです。
FizzBuzz問題ではたいてい、3で割り切れる場合、5で割り切れる場合、3と5の両方で割り切れる場合という順番で問題文が書かれていますが、その順番で実装すると正しい結果にならないという罠が仕掛けられています。それに引っかからずに実装することが求められるのです。
まとめ
JavaでFizzBuzz問題を解くサンプルと、FizzBuzz問題を解く際のポイントを解説しました。
一見簡単な問題ですが、若干トラップが仕掛けられているので、そのトラップをいかに回避するかがFizzBuzz問題を解くことができるかのポイントになります。
プログラミング言語を勉強したら、とりあえずFizzBuzzを力試しに書いてみましょう。
【お知らせ 無料!】未経験エンジニアがJavaでWebサイトを作成できるようになるための学習ロードマップを、無料で公開しています!
実体験に基づいて作成されているので、プログラミングスクールなどで指導されるロードマップにも劣らない品質です。
こちらの「【Java】エンジニア未経験者がJavaを効率的に勉強する手順を紹介します」リンクから無料で閲覧できるので、是非ご覧ください!