Esto debería imprimir la lista de posiciones sin el -1al 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 forbucle:
for (int index = word.indexOf(guess);
index >= 0;
index = word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Nota: si guesspuede ser más largo que un solo carácter, entonces es posible, al analizar la guesscadena, recorrer wordmá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.]
indexOfdevuelve -1 cuando no se encuentra el carácter.-1al final es que eldobucle ejecuta el cuerpo y luego lo descubreindex == -1en 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
CharSequenceAPI usando el método de extensión:fuente
fuente
Además, si desea encontrar todos los índices de una cadena en una cadena.
fuente
guessfue"aba"ywordfue"ababa", no está claro siguessocurre una o dos veces enword. (Quiero decir, está claro que uno puede encontrarguesscomenzando 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 queguesssiempre 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
myStringy cambiando elfromIndexparámetro enindexOf():fuente
mySubstring, independientemente de simySubstringse pueden encontrar en cada posición. No es en absoluto lo que quería OP ..Prueba esto
fuente