Cerca la prima parola da sostituire. Se si trova nella stringa, ricorrere alla parte della stringa prima dell'occorrenza e alla parte della stringa dopo l'occorrenza.
Altrimenti, continua con la parola successiva da sostituire.
Un'implementazione ingenua potrebbe apparire così
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);
}
Esempio di utilizzo:
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));
Produzione:
Once upon a foo, there was a bar and a baz.
Una versione meno 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);
}
Sfortunatamente, Java String
non ha un indexOf(String str, int fromIndex, int toIndex)
metodo. Ho omesso l'implementazione di indexOf
qui poiché non sono sicuro che sia corretto, ma può essere trovato su ideone , insieme ad alcuni tempi approssimativi di varie soluzioni pubblicate qui.
swap(String s1, String s2, String s3)
che scambia tutte le occorrenze dis2
cons3
e viceversa.