对不起,如果标题有误导性/不好,不确定如何说出这个问题。
我有多个字符串列表,其中大多数都包含我需要用其替换字符串的参数。其中一些字符串(在列表中)将包含多个要替换的参数。
实施例
Comp Status `%compname`
Comp SLA `%rackname` `%sgname` `%compname`
我需要用字符串替换graves`%----`中的任何内容,这取决于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?还是别的什么?
答案 0 :(得分:3)
首先,如果您没有使用正则表达式来定义要替换的值,则不应调用ArrayList<String> al = new ArrayList<String>();
al.add("2015/11/01 12.12.12.990");
al.add("2015/11/01 12.12.12.992");
al.add("2015/11/01 12.12.12.999");
al.add("2015/11/01 12.12.15.135");
al.add("2015/11/01 12.12.15.995");
al.add("2015/11/01 12.12.20.135");
al.add("2015/11/01 12.12.20.200");
al.add("2015/11/01 12.12.20.300");
al.add("2015/11/01 12.12.20.900");
HashMap<String, Integer> hash = new HashMap<>();
int count = 0;
for(int i=0;i<al.size();i++){
if(i>0 && al.get(i).substring(0, 19).equalsIgnoreCase(al.get(i-1).substring(0, 19)))
hash.put(al.get(i).substring(0, 19),++count);
else
hash.put(al.get(i).substring(0, 19),count=1);
}
for (Entry<String, Integer> entry : hash.entrySet()) {
System.out.println(entry.getKey()+","+entry.getValue());
}
(在您的情况下,它们显然是常量值,因此不需要抽象模式定义)
改为使用replaceAll
(将替换所有找到的匹配项)。
它将在内部调用replace
,但使用表示要替换的字段的常量值。
在调用Matcher#replaceAll
之前调用contains
没有多大意义,因为你要解析replace
两次。
如果String
不包含要替换的术语,则不会抛出任何异常:它不会替换它。
你也可以链接调用以获得一些吸引眼球:
String
答案 1 :(得分:1)
首选,因为您不需要首先检查它包含的天气。我想在一行中写出3行
MouseClick
答案 2 :(得分:1)
简单的事实是它取决于。
检查本身有开销,但替换不是免费的。
如果你有很多不同的参数,那么在某些时候,分析出哪些参数而不是盲目地应用它们会更便宜,因为大多数人可能不适用。
如果你的字符串特别长,那么也有意义,以免不必要地重复解析字符串。
最有效的技术是在流中执行此操作,仅解析字符串一次,并在显示时应用替换。
但是对于一些短字符串的3个参数,简单的强力替换虽然不是运行时效率最高,但在开发和维护方面效率更高。运行时效率的差异在应用程序中可能不够重要。