Kotlinで「文字列の中に文字の重複があるかどうか判定する関数」の実装

プログラミング

完全に昨日の続きをバラバラと。
結論だけ見たい方は一番下まで飛んでください!
※以下、私の四苦八苦が続きます…

Kotlinのsplitの戻り値はList

↑昨日の続きから本日も頑張り始めました。

とりあえず昨日時点では、

fun main(str: String):Boolean {
var result: Boolean = false
val list: List<String> = str.split("")
for (char in list) {
if (list.contains(char)) {
result = true
} else result = false
}
return(result)
}

こちらの状態でした。とりあえず、この関数は

・何を引数にしてもtrueが返ってくる

という悲しみの関数になってしまい、私もそのまま悲しくなり、昨日は寝ました。

そうして気分を新たに本日。
とりあえずこのように変えました。

fun main(str: String):Boolean {
var result: Boolean = false
val list: MutableList<String> = str.split("").toMutableList()
for (i in 0..list.size-1) {
var tempList: MutableList<String> = list.drop(i+1).toMutableList()
if (tempList.contains(list[i])) {
result = true
} else result
}
return(result)
}

ListをMutableにしたことが大きな進歩ですね。多分。
あと、for文もそれっぽいやつに近づきました。
だいぶ正解に近づいた気がします。とりあえずRunします。

>>> main("
")
[, a, b, c, d, e, f, g, ]
[a, b, c, d, e, f, g, ]
[b, c, d, e, f, g, ]
[c, d, e, f, g, ]
[d, e, f, g, ]
[e, f, g, ]
[f, g, ]
[g, ]
[]
[]
res13: kotlin.Boolean = true

なぜだ…!
というか、リストの最初と最後に空文字が入っているのがダサすぎるというか、これがtrue判定に寄与してしまっているのかも…。
最初と最後の要素を落とすことがdrop()でもできた気がする。

いや、dropじゃうまくいかない…。ここでremoveAtの出番か…。

などとしているうちに、
遂にできた気がします。それがこちら↓
Runします。

fun main(str: String):Boolean {
var result: Boolean = false
val list: MutableList<String> = str.split("").toMutableList()
list.removeAt(0)
list.removeAt(list.size-1)
for (i in 0..list.size-1) {
var tempList: MutableList<String> = list.drop(i+1).toMutableList()
if (tempList.contains(list[i])) {
result = true
} else result
}
return(result)
}
>>> main("abcdefg")
res46: kotlin.Boolean = false
>>> main("aabcdefg")
res47: kotlin.Boolean = true
>>> main("abcdefga")
res48: kotlin.Boolean = true
>>> main("abcdefbg")
res49: kotlin.Boolean = true

やりました!たぶん期待通りの結果です。

とはいえ、テストを別で書かないとですね。
Junitとかで書くのでしょうか…。
それは明日にでも書こうと思います。

お疲れ様でした。

コメント

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