字符串中单词索引'covering'特定位置



不确定这是否是合适的提问地点,但我找不到任何相关或类似的问题。

无论如何:想象一下你有一个像这样的字符串

val exampleString = "Hello StackOverflow this is my question, cool right?"

如果在该字符串中给定一个位置,例如23,则返回"占据"该字符串中该位置的单词。如果我们查看示例字符串,我们可以看到第23个字符是字母's'('this'的最后一个字符(,所以我们应该返回index = 5(因为'this'是第5个单词(。在我的问题中,空格被算作单词。例如,如果我们的位置是5,我们降落在第一个空间,因此我们应该返回index = 1

我正在Scala中实现这一点(但这应该是与语言无关的,我希望看到其他语言的实现(。

目前我有以下方法(假设exampleString是给定的字符串,charPosition是给定的位置(:

exampleString.split("((?<= )|(?= ))").scanLeft(0)((a, b) => a + b.length()).drop(1).zipWithIndex.takeWhile(_._1 <= charPosition).last._2 + 1

这是可行的,但它太复杂了,不能说实话。有没有更好(更有效?(的方法来实现这一点。我对foldscanmapfilter等函数还很陌生。。。但我很想了解更多。

提前谢谢。

def wordIndex(exampleString: String, index: Int): Int = {
exampleString.take(index + 1).foldLeft((0, exampleString.head.isWhitespace)) {
case ((n, isWhitespace), c) =>
if (isWhitespace == c.isWhitespace) (n, isWhitespace)
else (n + 1, !isWhitespace)
}._1
}

这将折叠字符串,跟踪前一个字符是否为空白,如果检测到更改,它将翻转布尔值并在计数上加1(n(。

这将能够处理空间组(例如,在hello world中,世界将在位置2(,并且字符串开头的空间将计为索引0,并且第一个单词将为索引1。

请注意,当输入是空字符串时,这是无法处理的,我将让您决定在这种情况下要做什么。

最新更新