不确定这是否是合适的提问地点,但我找不到任何相关或类似的问题。
无论如何:想象一下你有一个像这样的字符串
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
这是可行的,但它太复杂了,不能说实话。有没有更好(更有效?(的方法来实现这一点。我对fold
、scan
、map
、filter
等函数还很陌生。。。但我很想了解更多。
提前谢谢。
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。
请注意,当输入是空字符串时,这是无法处理的,我将让您决定在这种情况下要做什么。