Java Trim()与IndexOf()的比较

Java Trim()与IndexOf()的比较,java,string,parsing,optimization,text-parsing,Java,String,Parsing,Optimization,Text Parsing,我正在解析100个文件,其中包含1000行 我必须检查行是否以一些关键字开头 我有2个选项,不确定要考虑什么。 备选案文1: String[] keywordsArr = { "Everything", "Think", "Result", "What", "#Shop", "#Cure" }; for (int i = 0; i < linesOfCode.length; i++) { for (String keyWord : keywordsEnd

我正在解析100个文件,其中包含1000行

我必须检查行是否以一些关键字开头

我有2个选项,不确定要考虑什么。

备选案文1:

    String[] keywordsArr = { "Everything", "Think", "Result", "What", "#Shop",  "#Cure" };
    for (int i = 0; i < linesOfCode.length; i++) {

        for (String keyWord : keywordsEndingAtEndOfLogicalLine) {

            if (linesOfCode[i].indexOf(keyWord) > -1) {

                if (linesOfCode[i].trim().startsWith(keyWord)) {

                    linesOfCode[i] = "";
                    break;
                }
            }
        }
    }
备选案文2:

String[] keywordsArr = { "Everything", "Think", "Result", "What", "#Shop",  "#Cure" };
    for (int i = 0; i < linesOfCode.length; i++) {

        for (String keyWord : keywordsArr) {

            if (linesOfCode[i].trim().startsWith(keyWord)) {

                    linesOfCode[i] = "";
                    break;
            }
        }
    }

以关键字开头的行的频率为1/100。

尝试使用continue而不是break。continue不会停止循环,而是告诉程序向上一级,从而继续下一项的循环

为了避免在字符串开头查找关键字,在整个字符串中扫描关键字没有什么意义。如果这个想法是为了避免昂贵的修剪,那么使用更便宜的技术来查找队列中的第一个令牌可能是合理的

请注意,如果行以前缀为关键字的单词开头,则startsWith comparison可能会产生误报。例如,如果关键字为break,则代码行如下:

breakfast = "ham and eggs";
将被错误地删除


您可能希望研究使用StringTokenizer来提取字符串中的第一个单词,或者更好地使用正则表达式。

这是正则表达式非常有用的功能。您的代码相当于

for (int i = 0; i < linesOfCode.length; ++i) {
    linesOfCode[i] = linesOfCode.replaceAll(
        "^\\s+(Everything|Think|Result|what|#Shop,#Cure).*", "");
}

第二种方法看起来更简洁。但是如果你想删除关键字数组中的所有单词,你不应该使用break,因为一旦你执行linesOfCode[i]=即使找到了一个匹配项,也会导致内部循环中断。尝试更多的关键字几乎没有意义,因此中断似乎非常合适。
private static final Pattern PATTERN = Pattern.compile(
    ^\\s+(Everything|Think|Result|what|#Shop,#Cure)\\b");

for (int i = 0; i < linesOfCode.length; ++i) {
    if (Pattern.matcher(linesOfCode[i]).matches()) {
        linesOfCode[i] = "";
    }
}