gpt4 book ai didi

java - 替换子字符串的优雅解决方案

转载 作者:行者123 更新时间:2023-11-30 06:59:27 25 4
gpt4 key购买 nike

我遇到了一个棘手的问题。我有一个未修改的字符串,例如 abcdefg 和一个包含字符串和索引的对象数组。

例如,对象1包含d和索引[1, 2]

然后我会将子字符串 [1,2] 中的任何字母替换为 d,生成的字符串看起来像 adcdefg

当替换文本的长度与被替换文本的长度不同时,问题就来了。我需要一些方法来跟踪长度变化,否则进一步替换的索引将不准确。

这是我目前所拥有的:

 for (CandidateResult cResult : candidateResultList) {
int[] index = cResult.getIndex();

finalResult = finalResult.substring(0, index[0]) + cResult.getCandidate()
+ finalResult.substring(index[1], finalResult.length()); //should switch to stringbuilder
}
return finalResult;

这并没有处理上面提到的极端情况。

此外,如果有人想知道,这不是家庭作业。这实际上适用于我正在创建的 ocr 培训师程序。

最佳答案

这是一个实现,我还没有测试过,但你可以试试看。我会根据需要在代码中添加注释。

/** This class represents a replacement of characters in the original String, s[i0:if], 
* with a new string, str.
**/
class Replacement{
int s, e;
String str;
public Replacement(int s, int e, String str){
this.s = s;
this.e = e;
this.str = str;
}
}

String stringReplace(String str, List<Replacement> replacements){

// Sort Replacements by starting index
Collections.sort(replacements, new Comparator<Replacement>(){
@Override public int compare(Replacement r1, Replacement r2){
return Integer.compare(r1.s, r2.s);
}
};

StringBuilder sb = new StringBuilder();
int repPos = 0;

for(int i = 0; i < str.length; i++){
Replacement rep = replacements.get(repPos);
if(rep.s == i){ // Replacement starts here, at i == s
sb.append(rep.str); // Append the replacement
i = rep.e - 1; // Advance i -> e - 1
repPos++; // Advance repPos by 1
} else {
sb.append(str.charAt(i)); // No replacement, append char
}
}

return sb.toString();
}

[Edit:] 看到ptyx的回答后,我觉得那种方式可能更优雅。如果您以相反的顺序排序,则不必担心长度不同:

String stringReplace(String str, List<Replacement> replacements){

// Sort Replacements in reverse order by index
Collections.sort(replacements, new Comparator<Replacement>(){
@Override public int compare(Replacement r1, Replacement r2){
return -Integer.compare(r1.s, r2.s); // Note reverse order
}
};

// By replacing in reverse order, shouldn't affect next replacement.
StringBuilder sb = new StringBuilder(str);
for(Replacement rep : replacements){
sb.replace(rep.s, rep.e, rep.str);
}

return sb.toString();
}

关于java - 替换子字符串的优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com