技術関係

KotlinでPaizaの「単語のカウント」をやってみるぞ

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で解くことが出来ました。

コメント

タイトルとURLをコピーしました