To powinno wydrukować listę pozycji bez -1
na koniec, że rozwiązanie Petera Lawrey za nie miałem.
int index = word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = word.indexOf(guess, index + 1);
}
Można to również zrobić jako for
pętlę:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Uwaga: jeśli guess
może być dłuższy niż pojedynczy znak, analizując guess
łańcuch, można wykonać pętlę word
szybciej niż powyższe pętle. Wzorcem dla takiego podejścia jest algorytm Boyera-Moore'a . Wydaje się jednak, że nie istnieją warunki, które sprzyjałyby zastosowaniu takiego podejścia.]
indexOf
zwraca -1, gdy znak nie zostanie znaleziony.-1
na końcu, jest to, żedo
pętla wykonuje treść, a następnie odkrywa toindex == -1
w zakończeniuwhile
.Wynik zostałby użyty w następujący sposób:
Lub jako tablica:
źródło
W Javie9 można skorzystać z
iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
:źródło
źródło
Można to zrobić w funkcjonalny sposób w Javie 9 używając wyrażenia regularnego:
Oto rozwiązanie Kotlin umożliwiające dodanie tej logiki jako nowej nowej metody do
CharSequence
interfejsu API przy użyciu metody rozszerzenia:źródło
źródło
word.substring(word)
się nie skompiluje. : Pźródło
Ponadto, jeśli chcesz znaleźć wszystkie indeksy String w String.
źródło
guess
było"aba"
iword
było"ababa"
, nie jest jasne, czyguess
zdarzyło się to raz czy dwa razyword
. (To znaczy, jasne jest, że można znaleźćguess
początek w dwóch różnych pozycjach, ale ponieważ wystąpienia nakładają się, nie jest jasne, czy należy je policzyć.) W tej odpowiedzi przyjęto pogląd, że nakładające się wystąpienia nie są liczone jako odrębne. Oczywiście, ponieważ sformułowanie OP zdecydowanie sugeruje, żeguess
zawsze będzie miał długość 1, nie ma dwuznaczności.Ja też miałem ten problem, dopóki nie wymyśliłem tej metody.
Tej metody można użyć do znalezienia indeksów dowolnej flagi o dowolnej długości w ciągu, na przykład:
źródło
Wymyślona przeze mnie klasa do dzielenia strun. Na końcu znajduje się krótki test.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
jeśli to możliwe, podzieli spacje bez łamania słów, a jeśli nie, podzieli według indeksów zgodnie z maxLen.Inne metody kontroli podziału:
bruteSplitLimit(String str, int maxLen, int maxParts)
,spaceSplit(String str, int maxLen, int maxParts)
.Prosty kod testowy:
źródło
To jest rozwiązanie Java 8.
źródło
Można to zrobić poprzez iterację
myString
i zmianęfromIndex
parametrów windexOf()
:źródło
mySubstring
, niezależnie od tego, czymySubstring
można go znaleźć na każdej pozycji. Zupełnie nie to, czego chciał OP ...Spróbuj tego
źródło