Daha büyük bir dize (kaynak) içindeki bir alt dizenin (hedef) tüm dizinlerinin bir listesini almak için bir Scala kitaplığı API yöntemi var mı (yoksa, bir deyimsel yol) var mı? ScalaDoc'a bakmaya çalıştım ama belli bir şey bulamadı. Pek çok yararlı şey yapan birçok yöntem var, sanırım doğru arama terimlerini sunmuyordum.Belirli bir alt dizenin tüm indekslerini döndürme
Örneğin, "name: Yo, name: Jim, name: name, name: bozo" adlı bir kaynak dizilim varsa ve "name:" hedef dizgisini kullanırsam, geri dönmek istiyorum. Listenin [Int] listesini (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
}
Herhangi bir rehberlik beni büyük takdir uygun bir standart kütüphane giriş noktası ile bu değiştirerek verebilir:
İşte bu sorunu çözmek için benim hızlı beygir.
GÜNCELLEME 2014/Temmuz/22: Siddhartha Dutta cevabı esinlenerek
, benim kodu tighted. Şimdi şuna benzer:
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
}
Ayrıca, ben "aaaaaaaa" kaynağı dizesi var ve "aa" hedef dize kullanırsanız, geri bir List [Uluslararası] önüne geçmeye varsayılan olarak istiyorum Bulunan bir alt dizenin içinden başlayan bir aramayı atlayan Liste (0, 2, 4, 6). Varsayılan, "aaaaaaaa"/"aa" durumunda List (0, 1, 2, 3, 4, 5, 6) döndüren withinOverlaps parametresi için "true" iletilerek geçersiz kılınabilir.
Hayır "a [Standart] yöntemi" yok alır. Ayrıca, bu çalışma kodu olduğundan, kod incelemesi için * daha uygun olabilir. – user2864740
@ chaotic3quilibrium BSD Lisansı herhangi bir şekilde bu şekilde patron adam ben kopyalamazsa/uyarlarsam bana kızmaz mı? :) – ericpeters
@ericpeters StackOverflow üzerinde buraya gönderilen herhangi bir kod parçacığının aslında kamuya açık bir alan olduğu varsayılabilir. snippet'i ihtiyaç duyduğunuz herhangi bir içeriğe göre kesme/yapıştırma/değiştirme/özelleştirme yeteneğinizi sınırlayan herhangi bir lisans kısıtlaması tarafından engellenmez. – chaotic3quilibrium