我正在解析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。
答案 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。继续将告诉程序向上一级,而不是停止循环,从而继续循环下一个项目。