FizzBuzzに続いて、「単語のカウント」をKotlinでやってみました。
まだまだKotlinの書き方に慣れず、Rubyが頭から離れませんね。
早く慣れるべく書いていきます。
問題は以下のように入力から「単語と単語の出現数」を出力することが出来ればOK
- 入力例1
- red green blue blue green blue
- 出力例1
- red 1
green 2
blue 3
動作環境
Kotlin: 1.2.50
単語のカウントのコード
import java.util.Scanner fun main(args: Array<String>){ val scan = Scanner(System.`in`) val array = scan.nextLine().split(" ") val arrayWithoutDup = array.distinct() for(i in arrayWithoutDup){ println("${i} ${array.count(){ it == i }}") } }
5行目
ScannerクラスのnextLine()を使い、次の行(改行)までカーソルをスキップする。
そしてスキップした分を文字列として返します。
分かりにくいので補足
「red green blue blue green blue」という入力が与えられた場合の初期カーソルの位置
(ここ)→red green blue blue green blue
nextLine()を使うと?
red green blue blue green blue ←(カーソルは2行目の先頭に)
スキップされて返される文字列 → red green blue blue green blue
何を当たり前のことを、と思ってしまいますがこのように入力を取得します。
そして、split(” “)で空行区切りで文字列のリストにして返します(重複あり)
6行目
array.distinct()で重複なしのリストを取得
「red green blue」
8行目
for文で重複なしのリストを回します。
出現した回数は「重複ありのリスト」から
Iterable.count()を使い、「変数array」に条件が一致した回数を返すようにする。
これで完成。
動くには動くが、スッキリしないのでリファクタリングしてみましょう。
forEachを使ってリファクタリング
import java.util.Scanner fun main(args: Array<String>){ val scan = Scanner(System.`in`) val array = scan.nextLine().split(" ") array.distinct().forEach { word -> println("$word ${array.count{ it == word }}") } }
forをforEachに変更。
distinct().forEachと回すことで、変数「arrayWithoutDup」を定義せずに済んでます。
最初のコードよりスッキリはしました。
結果
こちらのコードで提出すると、ちゃんとパスします。
無事「単語のカウント」をKotlinで解くことが出来ました。
コメント