我正在解析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;
}
}
}
以关键字开头的行频为1/ 100。
发布于 2017-01-04 15:17:41
扫描整个字符串以查找关键字没有什么意义,只是为了避免查找字符串开头的关键字。如果这个想法是为了避免昂贵的trim
,那么使用一种更便宜的技术来查找队列中的第一个令牌可能是合理的。
请注意,如果行以其前缀为关键字的单词开头,则startsWith
比较可能会产生误报。例如,如果关键字是break
,则代码行如下:
breakfast = "ham and eggs";
会被错误地消除。
您可能希望研究一下如何使用StringTokenizer
提取字符串中的第一个单词,或者使用正则表达式更好。
发布于 2017-01-09 08:34:45
这是正则表达式非常有用的地方。您的代码等同于
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] = "";
}
}
发布于 2017-01-04 07:40:08
尝试使用continue而不是break。continue不会停止循环,而是会告诉程序上一级,从而继续循环下一项。
https://stackoverflow.com/questions/41457529
复制相似问题