字符串中的单词索引“覆盖”特定位置

时间:2018-11-27 14:31:56

标签: scala

不确定这是否是问的正确地方,但是我找不到任何相关或类似的问题。

无论如何:假设您有一个类似的字符串

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 foldscanmap之类的功能还很陌生,但是我想学习更多。

谢谢。

1 个答案:

答案 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.

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