gpt4 book ai didi

string - 返回特定子字符串的所有索引

转载 作者:行者123 更新时间:2023-12-04 14:27:41 27 4
gpt4 key购买 nike

是否有 Scala 库 API 方法(如果没有,则是一种惯用方法)来获取较大字符串(源)中子字符串(目标)的所有索引的列表?我试图查看 ScalaDoc,但找不到任何明显的东西。有很多方法可以做很多有用的事情,我猜我只是没有提交正确的搜索词。

例如,如果我有一个“name:Yo,name:Jim,name:name,name:bozo”的源字符串并且我使用了一个“name:”的目标字符串,我想得到一个 List[Int]列表 (0, 8, 17, 27)。

这是我解决问题的快速技巧:

def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
def recursive(index: Int, accumulator: List[Int]): List[Int] = {
if (!(index < source.size)) accumulator
else {
val position = source.indexOf(target, index)
if (position == -1) accumulator
else {
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
}
}

if (target.size <= source.size) {
if (!source.equals(target)) {
recursive(0, Nil).reverse
}
else List(0)
}
else Nil
}

您能给我的任何指导用适当的标准库入口点替换它,将不胜感激。

2019 年 6 月 16 日更新:

进一步的代码收紧:
  def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
def recursive(indexTarget: Int = index, accumulator: List[Int] = Nil): List[Int] = {
val position = source.indexOf(target, indexTarget)
if (position == -1)
accumulator
else
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
recursive().reverse
}

2014 年 7 月 22 日更新:

受到 Siddhartha Dutta 回答的启发,我收紧了我的代码。现在看起来像这样:
  def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
@tailrec def recursive(indexTarget: Int, accumulator: List[Int]): List[Int] = {
val position = source.indexOf(target, indexTarget)
if (position == -1) accumulator
else
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
recursive(index, Nil).reverse
}

此外,如果我有一个“aaaaaaaa”的源字符串并且我使用一个“aa”的目标字符串,我希望默认返回一个 List(0, 2, 4, 6) 的 List[Int] ,它跳过了一个从找到的子字符串内部开始搜索。可以通过为 insideOverlaps 参数传递“true”来覆盖默认值,在“aaaaaaaa”/“aa”情况下将返回 List(0, 1, 2, 3, 4, 5, 6)。

最佳答案

我总是倾向于处理像这样的问题的正则表达式技巧。我不会说它是正确的,但它的代码要少得多。 :)

val r = "\\Qname\\E".r
val ex = "name:Yo,name:Jim,name:name,name:bozo"

val is = r.findAllMatchIn(ex).map(_.start).toList

报价 \\Q\\E在这种情况下不是必需的,但是如果您要查找的字符串有任何特殊字符,那么它将是。

关于string - 返回特定子字符串的所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com