我有一个像
这样的字符串'John is a student. He is also a researcher. He is also a human.'
我有John
和第一He
的开始和结束索引。有没有办法用x
同时替换这些子串。请注意,我不应该替换第二个He
,因为我只有第一个He
的索引。
我们显然可以遍历字符串,只要指针不在子字符串窗口中并且放置x
就会复制。但是,还有比这更好的方法吗?
另请注意,索引不重叠。
答案 0 :(得分:3)
从最终替换是最佳解决方案。
public class NE {
public Integer startIndex;
public Integer endIndex;
}
public class CustomComparator implements Comparator<NE> {
public int compare(NE n1, NE n2) {
return n1.startIndex.compareTo(n2.startIndex);
}
}
ArrayList<NE> NEList = getIndexes();
Collections.sort(NEList, ner.new CustomComparator());
String finalString = 'John is a student. He is also a researcher. He is also a human.';
for(int i=NEList.size()-1;i>=0;i--){
NE ne = ner.new NE();
ne = NEList.get(i);
finalString = new StringBuilder(finalString).replace(ne.startIndex, ne.endIndex, 'x').toString();
}
System.out.println(finalString);
致谢:@AndyTurner
答案 1 :(得分:0)
试试这个:
String s="John is a student. He is also a researcher.";
int beginIndex=s.indexOf("He");
s=s.substring(0, beginIndex)+"x"+s.substring(beginIndex+2,s.length());
输出:约翰是一名学生。 x也是研究员。
答案 2 :(得分:0)
我不知道如何用索引来改变它们。但是,嘿,你可能首先通过搜索John和He的子串来找到索引。所以你可以跳过它并使用字符串静态方法replaceAll
。
String test = "John is a student. He is also a researcher.";
System.out.println(test.replaceAll("(John)|(He)", "x"));
事实上,您正在检查(John)|(He)
(&#34; John&#34;或#34; He&#34;)是否在字符串测试中。如果是这样,他们将被"x"
取代。
replaceAll
返回对新String对象的引用,如下所示:
x是一名学生。 x也是研究员。
答案 3 :(得分:0)
您可以使用与要替换的单词长度相同的占位符。然后用x替换占位符并获取结果。
String s = "John is a student. He is also a researcher.";
int firstStart = 0,firstEnd =4,secondStart=19,secondEnd=21;
String firstPlaceholder = String.format("%"+(firstEnd - firstStart )+"s", " ").replaceAll(" ", "x");
String secondPlaceholder = String.format("%"+(secondEnd -secondStart)+"s", " ").replaceAll(" ", "x");
String result = new StringBuilder(s).replace(firstStart, firstEnd, firstPlaceholder)
.replace(secondStart, secondEnd, secondPlaceholder)
.toString().replaceAll("x[x]+", "x");
System.out.println( result);
输出:
x is a student. x is also a researcher.
希望这可以提供帮助。