У меня есть прецедент, где мне нужно вернуть строку до разделителя. Строка (если найдена) из итератора Char.Найти строку в итераторе Char
Контракт:
- если итератор исчерпан (только на начальном), не возвращать None
- если разделитель строки найдены, возвращает все символы перед ним (пустой строкой в порядке), разделитель будет Опустить
- Остальное вернуть остальным персонажам
- не жадно исчерпайте итератор!
У меня есть этот рабочий раствор, но он чувствует, как Java (что, где я иду с)
class MyClass(str: String) {
def nextString(iterator: Iterator[Char]): Option[String] = {
val sb = new StringBuilder
if(!iterator.hasNext) return None
while (iterator.hasNext) {
sb.append(iterator.next())
if (sb.endsWith(str)) return Some(sb.stripSuffix(str))
}
Some(sb.toString())
}
}
Есть ли способ, что я могу сделать это в более функционально (в идеале без изменения подписи метода)?
Update: Вот как я проверить это
val desmurfer = new MyClass("_smurf_")
val iterator: Iterator[Char] = "Scala_smurf_is_smurf_great_smurf__smurf_".iterator
println(desmurfer.nextString(iterator))
println(desmurfer.nextString(iterator))
println(desmurfer.nextString(iterator))
println(desmurfer.nextString(iterator))
println(desmurfer.nextString(iterator))
println
println(desmurfer.nextString("FooBarBaz".iterator))
println(desmurfer.nextString("".iterator))
Выход:
Some(Scala)
Some(is)
Some(great)
Some()
None
Some(FooBarBaz)
None
Каков выходной сигнал, который вы ожидаете? –
@ S.Karthik добавлен образец вывода –
, пожалуйста, проверьте ответ –