Busque la primera palabra que se reemplazará. Si está en la cadena, repita en la parte de la cadena antes de la ocurrencia y en la parte de la cadena después de la ocurrencia.
De lo contrario, continúe con la siguiente palabra para ser reemplazado.
Una implementación ingenua podría verse así
public static String replaceAll(String input, String[] search, String[] replace) {
return replaceAll(input, search, replace, 0);
}
private static String replaceAll(String input, String[] search, String[] replace, int i) {
if (i == search.length) {
return input;
}
int j = input.indexOf(search[i]);
if (j == -1) {
return replaceAll(input, search, replace, i + 1);
}
return replaceAll(input.substring(0, j), search, replace, i + 1) +
replace[i] +
replaceAll(input.substring(j + search[i].length()), search, replace, i);
}
Uso de la muestra:
String input = "Once upon a baz, there was a foo and a bar.";
String[] search = new String[] { "foo", "bar", "baz" };
String[] replace = new String[] { "bar", "baz", "foo" };
System.out.println(replaceAll(input, search, replace));
Salida:
Once upon a foo, there was a bar and a baz.
Una versión menos ingenua:
public static String replaceAll(String input, String[] search, String[] replace) {
StringBuilder sb = new StringBuilder();
replaceAll(sb, input, 0, input.length(), search, replace, 0);
return sb.toString();
}
private static void replaceAll(StringBuilder sb, String input, int start, int end, String[] search, String[] replace, int i) {
while (i < search.length && start < end) {
int j = indexOf(input, search[i], start, end);
if (j == -1) {
i++;
} else {
replaceAll(sb, input, start, j, search, replace, i + 1);
sb.append(replace[i]);
start = j + search[i].length();
}
}
sb.append(input, start, end);
}
Desafortunadamente, Java String
no tiene indexOf(String str, int fromIndex, int toIndex)
método. He omitido la implementación de indexOf
aquí, ya que no estoy seguro de que sea correcto, pero se puede encontrar en ideone , junto con algunos tiempos difíciles de varias soluciones publicadas aquí.
swap(String s1, String s2, String s3)
que intercambie todas las apariciones des2
cons3
, y viceversa.