Это должно вывести список позиций без -1
в конце , что решение Питера Lawrey в уже имел.
int index = word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = word.indexOf(guess, index + 1);
}
Это также можно сделать в виде for
цикла:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Примечание: если длина guess
может быть больше одного символа, то можно, проанализировав guess
строку, выполнить цикл word
быстрее, чем это делают указанные выше циклы. Эталоном для такого подхода является алгоритм Бойера-Мура . Однако условий, которые способствовали бы использованию такого подхода, похоже, нет.]
indexOf
возвращает -1, если символ не найден.-1
в конце, заключается в том, чтоdo
цикл выполняет тело, а затем обнаруживает егоindex == -1
в завершенииwhile
.Результат будет использоваться так:
Или как массив:
источник
С Java9 можно использовать
iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
следующее: -источник
источник
Функционально это можно сделать в Java 9, используя регулярное выражение:
Вот решение Kotlin для добавления этой логики в качестве новых новых методов в
CharSequence
API с использованием метода расширения:источник
источник
word.substring(word)
не компилируется. : Pисточник
Кроме того, если вы хотите найти все индексы String в String.
источник
guess
было"aba"
иword
было"ababa"
, неясно,guess
происходит ли это один или два разаword
. (Я имею в виду, ясно, что можно найтиguess
начало в двух различных позициях, но поскольку вхождения перекрываются, неясно, следует ли считать их оба.) Этот ответ исходит из того, что перекрывающиеся вхождения не считаются отдельными. Конечно, поскольку формулировка OP настоятельно предполагает, чтоguess
длина всегда будет равна 1, двусмысленности не возникает.У меня тоже была эта проблема, пока я не придумал этот метод.
Этот метод можно использовать для поиска индексов любого флага любой длины в строке, например:
источник
Я придумал класс для разделения струн. В конце предоставляется небольшой тест.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
будет разделен пробелами без разрыва слов, если это возможно, а если нет, разделится по индексам в соответствии с maxLen.Другие методы, позволяющие управлять разделением:
bruteSplitLimit(String str, int maxLen, int maxParts)
,spaceSplit(String str, int maxLen, int maxParts)
.Простой тестовый код:
источник
Это решение для Java 8.
источник
Это можно сделать путем итерации
myString
и сдвигаfromIndex
параметра вindexOf()
:источник
mySubstring
, независимо от того,mySubstring
можно ли найти в каждой позиции. Совсем не то, что хотел OP ..Попробуй это
источник