Dies sollte die Liste der Positionen , ohne dass der Druck -1
am Ende , dass Peter Lawrey-Lösung hat sich hatte.
int index = word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = word.indexOf(guess, index + 1);
}
Es kann auch als for
Schleife ausgeführt werden:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Hinweis: Wenn guess
es länger als ein einzelnes Zeichen sein kann, ist es durch Analysieren der guess
Zeichenfolge möglich, word
schneller als die obigen Schleifen zu durchlaufen . Der Maßstab für einen solchen Ansatz ist der Boyer-Moore-Algorithmus . Die Bedingungen, die einen solchen Ansatz begünstigen würden, scheinen jedoch nicht gegeben zu sein.]
indexOf
-1 zurückgegeben wird, wenn das Zeichen nicht gefunden wird.-1
am Ende ist , dass diedo
Schleife , um den Körper ausführt und dann feststellt, dassindex == -1
in dem Abschlußwhile
.Das Ergebnis würde folgendermaßen verwendet:
Oder als Array:
quelle
Mit Java9 kann man
iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
Folgendes nutzen: -quelle
quelle
quelle
word.substring(word)
nicht kompiliert. : PDies kann mit Java 9 auf funktionale Weise unter Verwendung eines regulären Ausdrucks erfolgen:
Hier ist die Kotlin-Lösung, um diese Logik als neue neue Methode in die
CharSequence
API mithilfe der Erweiterungsmethode einzufügen:quelle
quelle
Auch wenn Sie alle Indizes eines Strings in einem String finden möchten.
quelle
guess
war"aba"
undword
war"ababa"
, ist es nicht klar, ob dasguess
ein- oder zweimal in auftrittword
. (Ich meine, es ist klar, dass manguess
ab zwei verschiedenen Positionen beginnen kann, aber da sich die Vorkommen überlappen, ist nicht klar, ob beide gezählt werden sollten.) Diese Antwort vertritt die Ansicht, dass überlappende Vorkommen nicht als verschieden gezählt werden. Da der Wortlaut von OP stark darauf hindeutet, dassguess
immer die Länge 1 sein wird, tritt die Mehrdeutigkeit natürlich nicht auf.Ich hatte auch dieses Problem, bis ich auf diese Methode kam.
Diese Methode kann verwendet werden, um Indizes eines beliebigen Flags beliebiger Länge in einer Zeichenfolge zu finden, zum Beispiel:
quelle
Eine Klasse zum Teilen von Saiten, die ich mir ausgedacht habe. Am Ende wird ein kurzer Test bereitgestellt.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
wird nach Möglichkeit durch Leerzeichen geteilt, ohne Wörter zu brechen, und wenn nicht, wird durch Indizes gemäß maxLen geteilt.Andere Methoden zur Steuerung der Aufteilung:
bruteSplitLimit(String str, int maxLen, int maxParts)
,spaceSplit(String str, int maxLen, int maxParts)
.Einfacher Testcode:
quelle
Dies ist eine Java 8-Lösung.
quelle
Dies kann durch Iterieren
myString
und Verschieben vonfromIndex
Parametern inindexOf()
:quelle
mySubstring
ausgedruckt, unabhängig davon, obmySubstring
an jeder Position gefunden werden kann. Überhaupt nicht das, was OP wollte ..Versuche dies
quelle