Java Trim()与IndexOf()的比较
我正在解析100个文件,其中包含1000行 我必须检查行是否以一些关键字开头 我有2个选项,不确定要考虑什么。 备选案文1: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
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] = "";
}
}