2015-11-02 34 views
1

对不起,如果标题是误导/坏,不知道如何说出这个问题。检查一个字符串是否需要调用String.replaceAll()与调用它

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

防爆

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阵列,并将其添加到一个列表瓦尔所以我可以写入整个瓦尔变量到CSV文件通过OpenCSV writeAll();

所以我应该使用1或2?或者有些不同?

+0

我只是做了vars.add(new String [] {s});而不是创建一个新的变量。 –

回答

3

首先,如果您不使用正则表达式来定义要替换的值(在您的情况下,它们明显是常数值,因此不需要抽象模式定义),则不应调用replaceAll

改为使用replace(它将替换发现的所有事件)。

它将内部调用Matcher#replaceAll,但具有表示要替换的字段的常量值。

在调用replace之前调用contains不会有很大的意义,因为您会解析String两次。

如果String不包含替换术语,则不会抛出异常:它不会替代它。

你也可以连接调用一些吸引眼球:

s = s 
    .replace("`%rackname`", rName) 
    .replace("`%compname`", compName) 
    .replace("`%sysname`", sysName); 
+1

令人惊讶的是[替换'的文档](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replace-java.lang.CharSequence-java.lang。 CharSequence-)没有明确地说如果没有改变,它会返回相同的字符串对象。这就是我期望它做的事情,[它在Oracle的JDK上做了什么](http://ideone.com/Eh2Iqi),但显然不能保证它。奇。 (我打算建议说它是这样做的,你看,但是...) –

+0

@ T.J.Crowder我同意文档可能会更明确一些。不过,它看起来很明显,因为当目标或替换为'null'时,除了'NPE'外不会引发异常。 – Mena

+0

我并不是说它会抛出异常,我们知道它不会这样做。只是可能做更多的工作比所需要的(复制字符串)。现在,**我知道它不会,**你**知道它不会,但文件真的应该说* *。 –

1

不想第一种方式,因为你不必摆在首位的天气它包含或不检查。我想写在一条线上的3条线

s = s.replaceAll("`%rackname`", rName).replaceAll("`%compname`", compName).replaceAll("`%sysname`", sysName); 
1

简单的事实是,它取决于。

检查本身有开销,但替换不是免费的。

如果你有很多不同的参数,那么在某些时候,解析出确切的参数而不是盲目地应用它们会更便宜,因为可能大多数都不适用。

如果你的字符串特别长,这也是有意义的,以免不必要地重复解析字符串。

最有效的技术是在一个流中完成它,仅解析字符串一次,并在显示时应用替换。

但是对于一些短字符串的3个参数,简单的暴力替换虽然不是运行时效率最高的,但在开发和维护上效率更高。运行效率的差异在应用程序中很可能不足。

+0

是的,我会测试这些全部的运行时间,但是我真的怀疑它会影响我的程序,因为它只在将字符串写入文件之前这样做。如果需要几秒钟才能避免UI被锁定,将这个函数引入它自己的线程会是一个好主意吗? –

相关问题