Java 用特定的单词列表替换字符串
用单词列表替换给定索引处的给定字符串。 问题陈述如下,有人能给我一些直觉或想法如何继续这个问题吗Java 用特定的单词列表替换字符串,java,string,replace,Java,String,Replace,用单词列表替换给定索引处的给定字符串。 问题陈述如下,有人能给我一些直觉或想法如何继续这个问题吗 //A replacement class similar to Linked List class Replacement { int start; String before; String after; //Method to replace the words public static String replaceRange
//A replacement class similar to Linked List
class Replacement {
int start;
String before;
String after;
//Method to replace the words
public static String replaceRanges(String text, List<Replacement> replacements) {
//TODO your code here
return null;
}
}
/* below is the example of the problem
Example #1:
Input:
text = "num foo"
replacements = [
{start: 0, before: "num", after: "String"},
{start: 4, before: "foo", after: "bar"}
]
Output:
replaceRanges(text, replacements) returns:
"String bar"
Example #2: Input: text = "num_fooBar", Output: "String_barBar"
*/
//类似于链表的替换类
类替换{
int启动;
前串;
串在后面;
//替换单词的方法
公共静态字符串替换范围(字符串文本、列表替换){
//在这里执行您的代码
返回null;
}
}
/*下面是这个问题的例子
示例#1:
输入:
text=“num foo”
替换=[
{开始:0,在“num”之前,在“String”之后,},
{开始:4,在“foo”之前,在“bar”之后}
]
输出:
replaceRanges(文本,替换)返回:
“字符串栏”
示例2:输入:text=“num\u fooBar”,输出:“String\u barBar”
*/
如果替换项从最小索引到最高索引排序,则可以从最后一个到第一个迭代列表,并在输入字符串中搜索子字符串,如果匹配,则替换它们
public static String replaceRanges(String text, List<Replacement> replacements) {
StringBuilder s = new StringBuilder(text);
for (int i = replacements.size() - 1; i>=0; i--) {
Replacement r = replacements.get(i);
int begin = r.start;
int end = r.start + r.before.length();
if (begin >= 0 && begin < s.length() && end >= 0 && end <= s.length()) {
if (s.substring(begin, end).equals(r.before)) {
s.replace(begin, end, r.after);
}
}
}
return s.toString();
}
您可以一个接一个地替换原始字符串,并记住必须将
开始
位置移动(因为您可以将较小的子字符串替换为较大的子字符串)
字符串有一个replace()和一个replaceAll()函数。如果这是学校的作业,祝你好运。如果没有,请查找字符串API方法。另外,
String
是CharSequence
接口的实现之一。好的,但是如何使用此处的替换类?这是一份清单,不是吗String@Nilanjan您可以对它进行迭代(Replacement r:replacements),然后访问属性r.before
和r.after
谢谢您的代码,这很有效。我将尝试提高时间复杂度。感谢您的代码,但是上面代码中提到的输入显示错误-线程“main”java.lang.StringIndexOutOfBoundsException中的异常:开始7,结束10,长度7位于java.base/java.lang.AbstractStringBuilder.CheckRangeSiobe(AbstractStringBuilder.java:1724)在java.base/java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:1017)在java.base/java.lang.StringBuilder.substring(StringBuilder.java:85)在Algo.StringReplacement.Replacements2(StringReplacement.java:29)在Algo.StringReplacement.main(StringReplacement.java:67)在这里发布哪些测试不起作用,我用上面提供的两个测试进行了测试,结果对他们有效。但你是对的,我没有检查索引是否有界。我编辑了代码,还包括了我的测试代码。试着运行它,如果它不起作用,在这里写下你的测试。另外,我的代码仍然不是空安全的,如果您希望输入为空,则需要添加空检查。
public static void main(String[] args) {
List<Replacement> replacements = List.of(
new Replacement(0, "num", "String"),
new Replacement(4, "foo", "bar"));
System.out.println(replaceRanges("num foo", replacements)); // Output: String bar
System.out.println(replaceRanges("num_fooBar", replacements)); // Output: String_barBar
System.out.println(replaceRanges("num_f", replacements)); // Output: String_f
System.out.println(replaceRanges("", replacements)); // Output:
System.out.println(replaceRanges("foonum", replacements)); // Output: foonum
}
public String replaceRanges(String text, List<Replacement> replacements) {
for(int i = 0; i < replacements.size(); i++) {
Replacement replacement = replacements.get(i);
String firstPart = text.substring(0, replacement.start);
String secondPart = text.substring(replacement.start, text.length());
String updatedSecondPart = secondPart.replace(replacement.before, replacement.after);
text = firstPart + updatedSecondPart;
updateStart(i + 1, replacements, updatedSecondPart.length() - secondPart.length());
}
return text;
}
privat void updateStart(int startIndex, List<Replacement> replacements, int shift) {
for( int i = startIndex; i < replacements.size(); i++) {
Replacement r = replacements.get(i);
r.start += shift;
}
}
Replacement r1 = new Replacement(0, "hi", "Hello");
Replacement r2 = new Replacement(2, "lo", "p");
Sting result = replaceRanges("hi louie!", asList(r1, r2)); //result = 'Hello puie!'