不确定这是否是问的正确地方,但是我找不到任何相关或类似的问题。
无论如何:假设您有一个类似的字符串
val exampleString = "Hello StackOverflow this is my question, cool right?"
如果给定该字符串中的位置,例如23,则返回“占据”字符串中该位置的单词。如果查看示例字符串,我们可以看到第23个字符是字母's'
('this'
的最后一个字符),因此我们应该返回index = 5
(因为{{1} }是第5个字)。在我的问题中,空格被视为单词。例如,如果给定位置5,我们将降落在第一个空格上,因此我们应返回'this'
。
我正在Scala中实现此功能(但这应该与语言无关,我希望看到其他语言的实现)。
当前,我采用以下方法(假设index = 1
是给定的字符串,而charPosition是给定的位置):
exampleString
这可行,但是说实话,它太复杂了。有没有更好的方法(更有效?)来实现这一目标。我对exampleString.split("((?<= )|(?= ))").scanLeft(0)((a, b) => a + b.length()).drop(1).zipWithIndex.takeWhile(_._1 <= charPosition).last._2 + 1
,fold
,scan
,map
之类的功能还很陌生,但是我想学习更多。
谢谢。
答案 0 :(得分:2)
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
)。 / p>
这将能够处理一组空格(例如,在hello world
中,world将位于位置2),并且字符串开头的空格将被视为索引0,而第一个单词将成为index 1.
请注意,当输入为空字符串时,这将无法处理,让您决定在这种情况下要做什么。