Czy istnieje metoda API biblioteki Scala (a jeśli nie, metoda idiomatyczna), aby uzyskać listę wszystkich indeksów dla podłańcucha (celu) w większym ciągu (źródle)? Próbowałem przeglądać ScalaDoc, ale nie byłem w stanie znaleźć niczego oczywistego. Jest tak wiele metod robiących tak wiele użytecznych rzeczy, domyślam się, że po prostu nie przesyłam odpowiednich wyszukiwanych słów.Zwróć wszystkie indeksy określonego podłańcucha.
Na przykład, jeśli mam ciąg źródłowy "name: Yo, name: Jim, name: name, name: bozo" i używam docelowego ciągu znaków "name:", chciałbym otrzymać Lista [Int] listy (0, 8, 17, 27).
Oto mój szybki hack, aby rozwiązać ten problem:
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
}
Wszelkie wskazówki może dać mi zastępując to z odpowiednim standardzie punktu wejścia biblioteki byłoby bardzo mile widziane.
UPDATE 2014/lipiec/22:
Zainspirowany odpowiedź Siddhartha Dutta, w I tighted mój kod. Teraz wygląda to tak:
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
}
Dodatkowo, jeśli mam ciąg źródłowy „AAAAAAAA” i używam ciąg docelowy „aa”, chciałbym domyślnie wrócić listy [Int] z Lista (0, 2, 4, 6), która pomija wyszukiwanie rozpoczynające się od znalezionego podciągu. Wartość domyślna może być nadpisana przez podanie "true" dla parametru withinOverlaps, który w przypadku "aaaaaaa"/"aa" zwróciłby listę (0, 1, 2, 3, 4, 5, 6).
nie, to nie jest „[średnia] Metoda”. Ponieważ jest to działający kod, * może * być bardziej odpowiedni do przeglądania kodu. – user2864740
@ chaotic3quilibrium Jakikolwiek sposób BSD Licencjonowałbyś tę metodę, aby szef nie wpadł w szał na mnie, gdybym ją skopiował/zaadaptował? :) – ericpeters
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@icicpeters tj. nieobciążone żadnymi ograniczeniami licencyjnymi ograniczającymi Twoją zdolność do wycinania/wklejania/modyfikowania/dostosowywania fragmentu do dowolnego kontekstu, którego potrzebujesz. – chaotic3quilibrium