检查一个字符串是否需要调用String.replaceAll()vs调用它

时间:2015-11-02 13:35:04

标签: java regex string replaceall

对不起,如果标题有误导性/不好,不确定如何说出这个问题。

我有多个字符串列表,其中大多数都包含我需要用其替换字符串的参数。其中一些字符串(在列表中)将包含多个要替换的参数。

实施例

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?还是别的什么?

3 个答案:

答案 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个参数,简单的强力替换虽然不是运行时效率最高,但在开发和维护方面效率更高。运行时效率的差异在应用程序中可能不够重要。