LoginSignup
3
0

More than 5 years have passed since last update.

プログラマ歴1年のボクガカンガエタサイキョウのFizzBuzz(@Java)

Last updated at Posted at 2018-04-13

動機

ちょっとプライベートで色々あってむしゃくしゃしたので、そういえばちゃんとやったことのなかったFizzBuzzとかいう奴をやってみようという気になった。そもそもアカウント登録だけして何もしていなかったので、とりあえず何か書いてみることから始めようと思いました。よかったらFeed Backお願いします。

目標

できるだけimmutable, 汎用性高い奴。

FizzBuzzの要件

あんまりよく知らないのだが、

  1. 3で割り切れる時はFizz
  2. 5で割りきれる時はBuzz
  3. どちらでも割りきれる時はFizz Buzz(FizzBuzzの時もある?)
  4. 割り切れない時は元の数字

と言った感じだったので、

  1. nで割りきれる時任意の文字列
  2. 複数で割りきれる時はその結合(" "で繋げる)
  3. 割り切れない時は元の数字
  4. callする数字の最初と最後を指定(inclusive)

としてみた
以下ソース

FizzBuzzCaller.java
package FizzBuzz;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FizzBuzzCaller {
    final private Map<Integer, String> callMap;

    FizzBuzzCaller(Map<Integer, String> callMap){
        this.callMap = Collections.unmodifiableMap(new HashMap<>(callMap));
    }

    public Map<Integer, String> getCallMap(){
        return callMap;
    }

    public List<String> getCallsListOnClosedRange(int start, int end){
        return IntStream.rangeClosed(start, end)
            .mapToObj(n ->
                callMap.entrySet().stream()
                .filter(e -> n % e.getKey() == 0)
                .map(e -> e.getValue())
                .reduce((x, y) -> x +" "+ y)
                .orElse(String.valueOf(n))
            )
            .collect(Collectors.toList());
    }
}

テスト

マイナスを念のため含めた。

CallTest.java
package FizzBuzz;

import java.util.HashMap;
import java.util.Map;

public class CallTest {
    public static void main(String[] arg){
        Map<Integer, String> callMap = new HashMap<>();
        callMap.put(3, "Fizz");
        callMap.put(5, "Buzz");
        callMap.put(-7, "Huss");
        callMap.put(13, "Boss");
        FizzBuzzCaller oneCaller = new FizzBuzzCaller(callMap);
        System.out.println(oneCaller.getCallMap());
        callMap.put(3, "DUZZ");// this does not work
        oneCaller.getCallsListOnClosedRange(-20,100).stream().forEach(System.out::println);
    }
}

結果的はこんな感じ

console
{3=Fizz, 5=Buzz, -7=Huss, 13=Boss}
Buzz
-19
Fizz
-17
-16
Fizz Buzz
Huss
Boss
Fizz
-11
Buzz
Fizz
-8
Huss
Fizz
Buzz
-4
Fizz
-2
-1
Fizz Buzz Huss Boss
1
2
Fizz
4
Buzz
Fizz
Huss
8
Fizz
Buzz
11
Fizz
Boss
Huss
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz Huss
22
23
Fizz
Buzz
Boss
Fizz
Huss
29
Fizz Buzz
31
32
Fizz
34
Buzz Huss
Fizz
37
38
Fizz Boss
Buzz
41
Fizz Huss
43
44
Fizz Buzz
46
47
Fizz
Huss
Buzz
Fizz
Boss
53
Fizz
Buzz
Huss
Fizz
58
59
Fizz Buzz
61
62
Fizz Huss
64
Buzz Boss
Fizz
67
68
Fizz
Buzz Huss
71
Fizz
73
74
Fizz Buzz
76
Huss
Fizz Boss
79
Buzz
Fizz
82
83
Fizz Huss
Buzz
86
Fizz
88
89
Fizz Buzz
Huss Boss
92
Fizz
94
Buzz
Fizz
97
Huss
Fizz
Buzz

反省

  • mapうざい?
  • なんかこのコンストラクタの使い方が釈然としない。
  • 遅延評価したい。
  • 他の言語で書いたらどうなるかそのうちやりたい。

参考にしたページ

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0