質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2321閲覧

kotlinにて配列から重複した文字を数える方法

tomuziso

総合スコア40

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/06/25 02:56

kotlin勉強中です。
配列の中にある重複した文字のカウントを数えたいです。

fun main(args: Array<String>){ val sampleString = "a a a b bb bb ccc" val array = sampleString.split(Regex("\s+")) val notDupElement = array.distinct() println(array) println(notDupElement) }

結果としては

a 3 b 1 bb 2 ccc 1

のようなものを得ることが目的です。

ひとまず重複のある配列から重複を取り除いたnotDupElementを得ることができました。
ここからarraynotDupElementを使用して重複を数えたいのですが、いい方法が見つかりません。
何かkotlinらしい書き方で結果を得る方法はあるでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

groupByを使えば一発です。
公式ドキュメント: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html

kotlin

1array.groupBy { it } 2 .mapValues { it.value.count() } 3// => {a=3, b=1, bb=2, ccc=1}

追記: ちなみにKotlin 1.1からだと、groupingByとeachCountも使えます。ちゃんと内部の実装を見てないですが、Mapへの変換を挟まないぶん効率が良さそうです。

kotlin

1array.groupingBy { it }.eachCount() 2// => {a=3, b=1, bb=2, ccc=1}

投稿2018/06/25 06:36

編集2018/06/25 07:02
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomuziso

2018/06/25 08:27

groupingByとeachCountで簡潔に一行で書けるんですね、勉強になりました! 結果を出力する際は forEach { (k, v) -> println("${k} ${v}")} という感じで回すのがベストでしょうか?
kakajika

2018/06/25 09:04

そうですね、それでよいと思います。 もちろん、forループのほうが馴染みやすければそちらでもOKです。 val counts = array.groupingBy { it }.eachCount() for ((k, v) in counts) { println("${k} ${v}") }
tomuziso

2018/06/26 01:19

ありがとうございます。 確かにforループの方が馴染みがあるますが、forEachもあるということで覚えておきます!
guest

0

count

kotlin

1println(array.count {it == "a"}) 2//=> 3

filter + count

kotlin

1println(array.filter {it == "a"}.count()) 2//=> 3

おまけ

kotlin

1println(sampleString.split(" ")) 2//=> [a, a, a, b, bb, bb, ccc]

投稿2018/06/25 03:50

編集2018/06/25 04:06
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomuziso

2018/06/25 08:18

回答ありがとうございます。 for(i in notDupElement){ println("${i} ${array.filter {it == i}.count()}") } countとfillerを組み合わせたものを回せばうまく取れそうでした。 splitで空文字を渡して配列作成も助かりました。ありがとうございます。
fuzzball

2018/06/25 08:22

いや、countでいいと思いますが‥。 array.count {it == i}
tomuziso

2018/06/26 01:18

失礼しました・・・ 確かにarray.count {it == i} だけで取れました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問