Recherchez le premier mot à remplacer. Si c'est dans la chaîne, recurse sur la partie de la chaîne avant l'occurrence et sur la partie de la chaîne après l'occurrence.
Sinon, continuez avec le mot suivant à remplacer.
Une implémentation naïve pourrait ressembler à ceci
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);
}
Exemple d'utilisation:
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));
Production:
Once upon a foo, there was a bar and a baz.
Une version moins naïve:
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);
}
Malheureusement, Java String
n'a pas de indexOf(String str, int fromIndex, int toIndex)
méthode. J'ai omis l'implémentation d' indexOf
ici car je ne suis pas certain qu'elle soit correcte, mais elle peut être trouvée sur ideone , avec quelques timings approximatifs de diverses solutions publiées ici.
swap(String s1, String s2, String s3)
qui permute toutes les occurrences des2
withs3
, et vice versa.