Trim()vs IndexOf()

时间:2017-01-04 06:28:18

标签: java string parsing optimization text-parsing

我正在解析100个包含1000行的文件。

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

我有两个选项,不确定要考虑哪些。

选项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;
            }
        }
    }

以关键字开头的行的频率是100 in 1。

3 个答案:

答案 0 :(得分:0)

对于关键字扫描整个字符串几乎没有意义,只是为了避免在字符串的开头查找关键字。如果想要避免昂贵的trim,那么使用更便宜的技术来找到该行中的第一个令牌可能是合理的。

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

breakfast = "ham and eggs";

会被错误地消除。

您可能希望调查使用StringTokenizer提取字符串中的第一个单词,甚至更好地使用正则表达式。

答案 1 :(得分:0)

这是正则表达式真正有用的东西。你的代码相当于

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

但您可能需要在关键字后面加上字边界(\\b)。为了更快的速度,你应该编译你的正则表达式

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] = "";
    }
}

答案 2 :(得分:-1)

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