KotlinでPaizaの「単語のカウント」をやる

FizzBuzzに続いて、「単語のカウント」をKotlinでやってみました。

まだまだKotlinの書き方に慣れず、Rubyが頭から離れませんね。
早く慣れるべく書いていきます。

以下のように、「入力から単語と単語の出現数」を出力することが出来ればOK

入力例1
red green blue blue green blue
出力例1
red 1
green 2
blue 3
スポンサーリンク

動作環境

Kotlin version 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」を定義せずに済んでます。

最初のコードよりスッキリはしました。

結果

こちらのコードで提出すると、ちゃんとパスします。