Cari kata pertama yang akan diganti. Jika ada di string, kembalilah pada bagian string sebelum terjadinya, dan pada bagian string setelah terjadinya.
Jika tidak, lanjutkan dengan kata berikutnya yang akan diganti.
Implementasi yang naif mungkin terlihat seperti ini
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);
}
Penggunaan sampel:
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));
Keluaran:
Once upon a foo, there was a bar and a baz.
Versi yang kurang naif:
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);
}
Sayangnya, Java String
tidak memiliki indexOf(String str, int fromIndex, int toIndex)
metode. Saya telah menghilangkan implementasi di indexOf
sini karena saya tidak yakin itu benar, tetapi dapat ditemukan di ideone , bersama dengan beberapa timing kasar dari berbagai solusi yang diposting di sini.
swap(String s1, String s2, String s3)
yang menukar semua kejadians2
dengans3
, dan sebaliknya.