trim()与indexof()

2vuwiymt  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(365)

我正在解析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。

xam8gpfp

xam8gpfp1#

为了避免在字符串的开头查找关键字,在整个字符串中扫描关键字没有什么意义。如果是为了避免昂贵的 trim ,则使用更便宜的技术来查找行中的第一个令牌可能是合理的。
请注意 startsWith 如果行以前缀为关键字的单词开头,则比较可能产生误报。例如,如果关键字 break ,代码行,例如:

breakfast = "ham and eggs";

会被错误地消除。
你可能想用 StringTokenizer 要提取字符串中的第一个单词,甚至更好,请使用正则表达式。

pkwftd7m

pkwftd7m2#

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

csbfibhn

csbfibhn3#

这是正则表达式非常适合的。你的代码相当于

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

相关问题