Esto debería imprimir la lista de posiciones sin el -1
al final que ha tenido la solución de Peter Lawrey .
int index = word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = word.indexOf(guess, index + 1);
}
También se puede hacer como un for
bucle:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Nota: si guess
puede ser más largo que un solo carácter, entonces es posible, al analizar la guess
cadena, recorrer word
más rápido que los bucles anteriores. El punto de referencia para tal enfoque es el algoritmo de Boyer-Moore . Sin embargo, las condiciones que favorecerían el uso de tal enfoque no parecen darse.]
indexOf
devuelve -1 cuando no se encuentra el carácter.-1
al final es que eldo
bucle ejecuta el cuerpo y luego lo descubreindex == -1
en la terminaciónwhile
.El resultado se usaría así:
O como una matriz:
fuente
Con Java9, uno puede hacer uso de la
iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
siguiente manera: -fuente
fuente
fuente
word.substring(word)
no se compilará. : PEsto se puede hacer de manera funcional con Java 9 usando expresiones regulares:
Aquí está la solución de Kotlin para agregar esta lógica como un nuevo método nuevo en la
CharSequence
API usando el método de extensión:fuente
fuente
Además, si desea encontrar todos los índices de una cadena en una cadena.
fuente
guess
fue"aba"
yword
fue"ababa"
, no está claro siguess
ocurre una o dos veces enword
. (Quiero decir, está claro que uno puede encontrarguess
comenzando en dos posiciones distintas, pero dado que las ocurrencias se superponen, no está claro si ambas deben contarse). Esta respuesta considera que las ocurrencias superpuestas no se cuentan como distintas. Por supuesto, dado que la redacción de OP sugiere fuertemente queguess
siempre tendrá la longitud 1, la ambigüedad no surge.También tuve este problema, hasta que se me ocurrió este método.
Este método se puede utilizar para encontrar índices de cualquier bandera de cualquier longitud en una cadena, por ejemplo:
fuente
Se me ocurrió una clase para partir cuerdas. Se proporciona una breve prueba al final.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
se dividirá por espacios sin romper palabras, si es posible, y si no, se dividirá por índices de acuerdo con maxLen.Otros métodos proporcionados para controlar cómo se divide:
bruteSplitLimit(String str, int maxLen, int maxParts)
,spaceSplit(String str, int maxLen, int maxParts)
.Código de prueba simple:
fuente
Esta es una solución de Java 8.
fuente
Esto se puede hacer iterando
myString
y cambiando elfromIndex
parámetro enindexOf()
:fuente
mySubstring
, independientemente de simySubstring
se pueden encontrar en cada posición. No es en absoluto lo que quería OP ..Prueba esto
fuente