Java 独立替换字符串中的一组子字符串(并行)
//值数组的形式为{“var1”、“val1”、“var2”、“val2”、…}Java 独立替换字符串中的一组子字符串(并行),java,string,dictionary,replace,str-replace,Java,String,Dictionary,Replace,Str Replace,//值数组的形式为{“var1”、“val1”、“var2”、“val2”、…} 公共静态字符串替换方法(字符串模板、字符串…值){ 字符串p=模板; 对于(int i=0;iabcd 值的子字符串数组[“a”、“b”、“c”、“d”] 意思是用“b”替换“a”,用“c”替换“b” 所以,现在问题来了 1.我的上述实现在第一个循环中将“a”替换为“b”,然后在第二个循环中将“b”替换为“c”,使最后一个字符串成为“cccd”。但我想把它改成“bccd”。串联替换使用先前替换的字符串进一步工作。
公共静态字符串替换方法(字符串模板、字符串…值){
字符串p=模板;
对于(int i=0;i
此方法使用字符串中的相应值替换一组子字符串。
例如:-string=>abcd
值的子字符串数组[“a”、“b”、“c”、“d”]
意思是用“b”替换“a”,用“c”替换“b”
所以,现在问题来了
1.我的上述实现在第一个循环中将“a”替换为“b”,然后在第二个循环中将“b”替换为“c”,使最后一个字符串成为“cccd”。但我想把它改成“bccd”。串联替换使用先前替换的字符串进一步工作。
是否有一种方法可以更有效地并行替换所有子字符串
2.如何使用Map而不是array(上述方法的第二个参数)实现上述方法?是Map更好,还是上面的实现更好 在a到b、b到c以及类似比较的特定情况下,可以通过按相反顺序给出值数组来获得所需的结果
在更一般的情况下,您可以将“a”替换为“b”,然后将“b”替换为“c”。。。依此类推,最后删除所有下划线。当然,如果模板文本包含下划线,您可以选择另一个您知道不存在的字符,然后改用它。在a到b、b到c以及此类比较的特定情况下,您可以通过按相反顺序提供值数组来获得所需的结果
在更一般的情况下,您可以将“a”替换为“b”,然后将“b”替换为“c”。。。依此类推,最后删除所有下划线。当然,如果您的模板文本包含下划线,您可以选择另一个您知道不存在的字符,然后改用它。您最好使用映射并在
模板中的每个字符上迭代。这样可以避免在同一索引位置进行多次替换
String template = "abcd";
StringBuilder populatedTemplate = new StringBuilder();
HashMap<Character, Character> map = new HashMap<>();
map.put('a', 'b');
map.put('b', 'c');
for (int i = 0; i < template.length(); i++) {
populatedTemplate.append(
map.getOrDefault(template.charAt(i), template.charAt(i)));
}
System.out.println(populatedTemplate);
String template=“abcd”;
StringBuilder populatedTemplate=新建StringBuilder();
HashMap=newHashMap();
地图。放置('a','b');
地图放置('b','c');
对于(int i=0;i
与此解决方案相比,此解决方案的一些支持参数
- 避免在同一索引位置进行多次替换,第一步将
a
替换为b
,第二步将b
替换为c
,这将导致a
替换为c
- 仅在
模板上迭代一次
- 不要为每个替换对创建一个新的
String
对象,因为它应该在这里p=p.replace(值[i],值[i+1])代码>
您最好使用一个映射并迭代
模板中的每个字符。这样可以避免在同一索引位置进行多次替换
String template = "abcd";
StringBuilder populatedTemplate = new StringBuilder();
HashMap<Character, Character> map = new HashMap<>();
map.put('a', 'b');
map.put('b', 'c');
for (int i = 0; i < template.length(); i++) {
populatedTemplate.append(
map.getOrDefault(template.charAt(i), template.charAt(i)));
}
System.out.println(populatedTemplate);
String template=“abcd”;
StringBuilder populatedTemplate=新建StringBuilder();
HashMap=newHashMap();
地图。放置('a','b');
地图放置('b','c');
对于(int i=0;i
与此解决方案相比,此解决方案的一些支持参数
- 避免在同一索引位置进行多次替换,第一步将
a
替换为b
,第二步将b
替换为c
,这将导致a
替换为c
- 仅在
模板上迭代一次
- 不要为每个替换对创建一个新的
String
对象,因为它应该在这里p=p.replace(值[i],值[i+1])代码>
使用Map而不是字符串数组的解决方案,以避免ArrayIndexOutOfBoundsException。例如,您将使用字符串数组获得此调用的异常:
replace方法(“abcd”、“a”、“b”、“c”)
使用地图:
public static String replaceMethodMap(String template, Map<String, String> map) {
String p = template;
for (String key : map.keySet()) {
p = p.replace(key, map.get(key));
}
return p;
}
公共静态字符串替换方法映射(字符串模板,映射映射){
字符串p=模板;
for(字符串键:map.keySet()){
p=p.replace(key,map.get(key));
}
返回p;
}
使用Map而不是String数组的解决方案,以避免获取ArrayIndexOutOfBoundsException。例如,您将使用字符串数组获得此调用的异常:
replace方法(“abcd”、“a”、“b”、“c”)
使用地图:
public static String replaceMethodMap(String template, Map<String, String> map) {
String p = template;
for (String key : map.keySet()) {
p = p.replace(key, map.get(key));
}
return p;
}
公共静态字符串替换方法映射(字符串模板,映射映射){
字符串p=模板;
for(字符串键:map.keySet()){
p=p.replace(key,map.get(key));
}
返回p;
}
在我看来,从数组中删除第一个元素似乎是个问题……你想说的话很不连贯。如果template=“abcd”
和values={a”,“b”,“c”,“d”}
则输出为bbdd
@Hackerdarshi如果template-“abcd”和values={a”,“b”,“c”,“d”},则a->b和c->d,我正在使用数组的交替索引来表示键值对。对我来说,这似乎是从数组中删除第一个元素的问题……你想说的话很不连贯。如果template=“abcd”
和values={a”,“b”,“c”,“d”}
那么输出是bbdd
@Hackerdarshi如果template-“abcd”和values={a”,“b”,“c”,“d”},那么a->b和c->d,我正在为键值对使用数组的替代索引。谢谢,这就是我正在寻找的。你能给我一些吗