Isso deve imprimir a lista de posições sem a -1
no final que a solução de Peter Lawrey tem tido.
int index = word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = word.indexOf(guess, index + 1);
}
Também pode ser feito em for
loop:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Nota: se guess
pode ser mais longo do que um único caractere, então é possível, analisando a guess
string, fazer um loop word
mais rápido do que os loops acima. O benchmark para tal abordagem é o algoritmo Boyer-Moore . No entanto, as condições que favorecem o uso de tal abordagem não parecem estar presentes.]
indexOf
retorna -1 quando o caractere não é encontrado.-1
no final é que odo
loop executa o corpo e, em seguida, descobre issoindex == -1
na finalizaçãowhile
.O resultado seria usado assim:
Ou como uma matriz:
fonte
Com o Java9, pode-se fazer uso do
iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
seguinte: -fonte
fonte
Isso pode ser feito de maneira funcional com Java 9, usando expressão regular:
Esta é a solução Kotlin para adicionar essa lógica como um novo método à
CharSequence
API usando o método de extensão:fonte
fonte
word.substring(word)
não compila. : Pfonte
Além disso, se você quiser encontrar todos os índices de uma String em uma String.
fonte
guess
foi"aba"
eword
foi"ababa"
, não está claro seguess
ocorre uma ou duas vezes emword
. (Quer dizer, é claro que pode-se encontrarguess
começando em duas posições distintas, mas como as ocorrências se sobrepõem, não está claro se ambas devem ser contadas.) Essa resposta considera que ocorrências sobrepostas não são contadas como distintas. Claro, uma vez que o texto de OP sugere fortemente queguess
sempre terá comprimento 1, a ambigüidade não surge.Eu também tive esse problema, até que inventei esse método.
Este método pode ser usado para encontrar índices de qualquer sinalizador de qualquer comprimento em uma string, por exemplo:
fonte
Uma classe para dividir cordas que eu criei. Um breve teste é fornecido no final.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
será dividido por espaços sem quebrar palavras, se possível, e se não, será dividido por índices de acordo com maxLen.Outros métodos fornecidos para controlar como é dividido:
bruteSplitLimit(String str, int maxLen, int maxParts)
,spaceSplit(String str, int maxLen, int maxParts)
.Código de teste simples:
fonte
Esta é uma solução java 8.
fonte
Isso pode ser feito iterando
myString
e mudando ofromIndex
parâmetro emindexOf()
:fonte
mySubstring
, independentemente demySubstring
poder ser encontrado em cada posição. Nem um pouco o que a OP queria ..Tente isto
fonte