Değiştirilecek ilk kelimeyi arayın. Dize içindeyse, dizenin oluşumdan önceki kısmında ve dizenin oluşumundan sonraki kısmında yinelenir.
Aksi takdirde, değiştirilecek bir sonraki kelimeyle devam edin.
Saf bir uygulama şöyle görünebilir
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);
}
Örnek kullanım:
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));
Çıktı:
Once upon a foo, there was a bar and a baz.
Daha az saf bir versiyon:
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);
}
Ne yazık ki, Java'nın yöntemi String
yoktur indexOf(String str, int fromIndex, int toIndex)
. indexOf
Burada uygulanmasını atladım , çünkü doğru olduğundan emin değilim, ama burada yayınlanan çeşitli çözümlerin kaba zamanlamaları ile birlikte ideone'de bulunabilir .
swap(String s1, String s2, String s3)
tüm oluşumlarını değiştiren bir işlev olmalıdır ve bunun tersi de geçerlidir.s2
s3