Замыкание scala
def Search2(word:String,str:String):Int={
str.indexOf(word)
}
У меня есть функция для поиска первого вхождения подстроки. Как написать замыкание, каждый вызов которого возвращал бы очередной индекс вхождения подстроки в строку? Если слова закончились, то вернуть nil.
Ответы (2 шт):
Автор решения: Mikhail Ionkin
→ Ссылка
Что-то типа такого?
def indexes(word: String, text: String): () => Int = {
def indexOf(word: String, text: String, from: Int = 0): Int = text.indexOf(word, from)
var fromIndex: Int = 0
var wasEvaluated: Boolean = false
() => {
if (fromIndex != -1) {
if (wasEvaluated) {
fromIndex += word.length
}
fromIndex = indexOf(word, text, fromIndex)
wasEvaluated = true
}
fromIndex
}
}
val fun = indexes("om", "om om am om")
for (i <- 0 until 5) println(fun())
Результат: 0 3 9 -1 -1
Тут должна быть или функция, возвращающая коллекцию (в этом случае можно вернуть Nil в смысле пустого списка), либо же стоит возвращать числа, в этом случае вместо Nil (который типа List[Nothing]) логично возвращать -1.
Автор решения: Alexey Ki
→ Ссылка
var index = 0
val func = () => {
val start = word.r
.findFirstMatchIn(str.drop(index))
.map(_.start + index)
.getOrElse(-1)
if (start != -1)
index = start + word.length
start
}
Похоже на вариант Mikhail Ionkin, только приправлено опшионами
P.S. Советую присмотреться к word.r.findAllMatchIn(str), он возвращает не индексы, но возможно это именно то что Вам нужно