检查字符串是否需要调用 String.replaceAll() 与调用它
Checking if a string needs to call String.replaceAll() vs calling it
抱歉,如果标题是 misleading/bad,我不确定如何表达这个问题。
我有多个字符串列表,其中大部分都包含我需要用来替换字符串的参数。其中一些字符串(在列表中)将包含多个要替换的参数。
例
Comp Status `%compname`
Comp SLA `%rackname` `%sgname` `%compname`
我需要用字符串替换坟墓 `%----` 中的任何内容,这取决于 for 循环中的位置。
我的问题是,我应该检查字符串以查看它是否具有我需要切换的这些参数之一,还是应该只调用每个字符串上的所有 replaceAll() 语句。
1.
for(String s: rackStr){
newString = new String[1];
s = s.replaceAll("`%rackname`", rName);
s = s.replaceAll("`%compname`", compName);
s = s.replaceAll("`%sysname`", sysName);
newString[0] = s;
System.out.println(newString[0]);
vars.add(newString);
}
2.
for(String s: rackStr){
newString = new String[1];
if(s.contains("`%rackname")){
s = s.replaceAll("`%rackname`", rName);
}
if(s.contains("`%compname")){
s = s.replaceAll("`%compname`", compName);
}
if(s.contains("`%sysname")){
s = s.replaceAll("`%sysname`", sysName);
}
newString[0] = s;
System.out.println(newString[0]);
vars.add(newString);
}
注意我必须使 newString 成为一个数组,并将其添加到 List vars 中,这样我就可以通过 OpenCSV writeAll();
将整个 vars 变量写入 CSV 文件
那么我应该使用 1 还是 2?或者有什么不同?
首先,如果您不使用正则表达式来定义要替换的值,则不应调用 replaceAll
(在您的情况下,它们显然是常量值,因此无需抽象模式定义)。
改用replace
(它将替换找到的所有匹配项)。
它将在内部调用 Matcher#replaceAll
,但使用代表您要替换的字段的常量值。
在调用 replace
之前调用 contains
没有多大意义,因为您会解析 String
两次。
如果 String
不包含要替换的术语,则不会抛出异常:它只是不会替换它。
您还可以链式调用来获得一些养眼效果:
s = s
.replace("`%rackname`", rName)
.replace("`%compname`", compName)
.replace("`%sysname`", sysName);
首选第一种方式,因为你不需要首先检查它是否包含天气。我想把 3 行写成一行
s = s.replaceAll("`%rackname`", rName).replaceAll("`%compname`", compName).replaceAll("`%sysname`", sysName);
简单的事实是,这取决于。
检查本身有开销,但替换不是免费的。
如果您有很多不同的参数,那么在某些时候,准确地解析出哪些参数比盲目地应用它们会更便宜,因为大多数人可能不会应用。
如果您的字符串特别长,这样也可以避免不必要地重复解析字符串。
最有效的技术是在流中进行,只解析一次字符串,并在出现时应用替换。
但是对于一些短字符串的 3 个参数,简单的暴力替换虽然在运行时不是最有效的,但在开发和维护方面要高效得多。运行时效率的差异可能不足以影响应用程序。
抱歉,如果标题是 misleading/bad,我不确定如何表达这个问题。
我有多个字符串列表,其中大部分都包含我需要用来替换字符串的参数。其中一些字符串(在列表中)将包含多个要替换的参数。
例
Comp Status `%compname`
Comp SLA `%rackname` `%sgname` `%compname`
我需要用字符串替换坟墓 `%----` 中的任何内容,这取决于 for 循环中的位置。
我的问题是,我应该检查字符串以查看它是否具有我需要切换的这些参数之一,还是应该只调用每个字符串上的所有 replaceAll() 语句。
1.
for(String s: rackStr){
newString = new String[1];
s = s.replaceAll("`%rackname`", rName);
s = s.replaceAll("`%compname`", compName);
s = s.replaceAll("`%sysname`", sysName);
newString[0] = s;
System.out.println(newString[0]);
vars.add(newString);
}
2.
for(String s: rackStr){
newString = new String[1];
if(s.contains("`%rackname")){
s = s.replaceAll("`%rackname`", rName);
}
if(s.contains("`%compname")){
s = s.replaceAll("`%compname`", compName);
}
if(s.contains("`%sysname")){
s = s.replaceAll("`%sysname`", sysName);
}
newString[0] = s;
System.out.println(newString[0]);
vars.add(newString);
}
注意我必须使 newString 成为一个数组,并将其添加到 List vars 中,这样我就可以通过 OpenCSV writeAll();
将整个 vars 变量写入 CSV 文件那么我应该使用 1 还是 2?或者有什么不同?
首先,如果您不使用正则表达式来定义要替换的值,则不应调用 replaceAll
(在您的情况下,它们显然是常量值,因此无需抽象模式定义)。
改用replace
(它将替换找到的所有匹配项)。
它将在内部调用 Matcher#replaceAll
,但使用代表您要替换的字段的常量值。
在调用 replace
之前调用 contains
没有多大意义,因为您会解析 String
两次。
如果 String
不包含要替换的术语,则不会抛出异常:它只是不会替换它。
您还可以链式调用来获得一些养眼效果:
s = s
.replace("`%rackname`", rName)
.replace("`%compname`", compName)
.replace("`%sysname`", sysName);
首选第一种方式,因为你不需要首先检查它是否包含天气。我想把 3 行写成一行
s = s.replaceAll("`%rackname`", rName).replaceAll("`%compname`", compName).replaceAll("`%sysname`", sysName);
简单的事实是,这取决于。
检查本身有开销,但替换不是免费的。
如果您有很多不同的参数,那么在某些时候,准确地解析出哪些参数比盲目地应用它们会更便宜,因为大多数人可能不会应用。
如果您的字符串特别长,这样也可以避免不必要地重复解析字符串。
最有效的技术是在流中进行,只解析一次字符串,并在出现时应用替换。
但是对于一些短字符串的 3 个参数,简单的暴力替换虽然在运行时不是最有效的,但在开发和维护方面要高效得多。运行时效率的差异可能不足以影响应用程序。