ค้นหาคำแรกที่จะถูกแทนที่ หากอยู่ในสตริงให้ทำการหักส่วนของสตริงก่อนที่จะเกิดขึ้นและในส่วนของสตริงหลังจากที่เกิดขึ้น
มิฉะนั้นให้ดำเนินการต่อด้วยคำถัดไปเพื่อแทนที่
การนำไปปฏิบัติที่ไร้เดียงสาอาจมีลักษณะเช่นนี้
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);
}
ตัวอย่างการใช้งาน:
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));
เอาท์พุท:
Once upon a foo, there was a bar and a baz.
รุ่นที่ไร้เดียงสา:
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);
}
น่าเสียดายที่ Java String
ไม่มีindexOf(String str, int fromIndex, int toIndex)
วิธีการ ฉันไม่ได้ใช้งานindexOf
ที่นี่เนื่องจากฉันไม่แน่ใจว่าถูกต้อง แต่สามารถพบได้ในideoneพร้อมกับกำหนดเวลาคร่าวๆของโซลูชันต่างๆที่โพสต์ที่นี่
swap(String s1, String s2, String s3)
ที่สัญญาทั้งหมดที่เกิดขึ้นของs2
ด้วยs3
และในทางกลับกัน