是否有一個Scala庫API方法(如果不是,一種慣用的方式)獲取一個更大的字符串(源)中的子字符串(目標)的所有索引列表?我試圖查看ScalaDoc,但無法找到任何明顯的東西。有很多方法做這麼多有用的事情,我猜我只是沒有提交正確的搜索條件。返回一個特定子字符串的所有索引
例如,如果我有一個「name:Yo,name:Jim,name:name,name:bozo」的源字符串,並使用「name:」的目標字符串,我想返回一個List(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
}
任何指導,你可以給我一個適當的標準庫入口點更換這將不勝感激。
UPDATE 2014 /月/ 22:
由悉達多杜塔的回答啓發,我地張緊了我的代碼。現在看起來是這樣的:
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」的目標字符串,我會在默認情況下想拿回列表[INT]的列表(0,2,4,6)從搜索到的子字符串中跳過搜索。可以通過爲「aaaaaaaa」/「aa」情況下返回List(0,1,2,3,4,5,6)的withinOverlaps參數傳遞「true」來覆蓋默認值。
沒有,不是 「a [標準]方法」。此外,由於這是工作代碼,因此它可能更適合代碼審查。 – user2864740
@ chaotic3quilibrium任何方式,你可以BSD許可證的方法,所以老闆的人不生氣,如果我複製/適應它? :) – ericpeters
@ericpeters我的理解是,任何在StackOverflow上發佈的代碼片段都可以假定爲公有領域;即不受任何許可約束限制,限制了您將剪輯剪切/粘貼/修改/定製到任何需要的上下文的能力。 – chaotic3quilibrium