我有一个如下所示的列表:
List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");
然后我读了一个文件并逐行浏览。我想查看该行的开头是否与列表中的任何内容匹配。
我之前就是这样做的,但这似乎不是实现我想要做的最有效的方式:
/*
if (!strLine.startsWith("//") && !strLine.startsWith("/*") && !strLine.startsWith("*") && !strLine.startsWith("}") && !strLine.startsWith("{")) {
System.out.println(strLine);
}
*/
有关最佳方法的建议吗?
答案 0 :(得分:1)
public boolean isInList(List<String> list, String strline){
for(String message:list){
if(strline.startsWith(message)){
return true;
}
}
return false;
}
//Usage
String someString = "something";
List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");
if(isInList(messages,someString)){
System.out.println("foundMatch");
}
答案 1 :(得分:1)
您可以使用正则表达式和匹配器。但是你不能使用字符串列表,但你可以在运行时构建它。
Matcher m = Pattern.compile("^(//|/\\*|\\*|\\{|\\}).*").matcher("");
if (!matcher.reset(strLine).matches()) {
// does not start
}
示例:
String str = "abc\n// foo\n/* foo */\nthing\n{bar\n{baz\nlol";
Matcher matcher = Pattern.compile("^(//|/\\*|\\*|\\{|\\}).*").matcher("");
for (String strLine : str.split("\n")) {
if (!matcher.reset(strLine).matches()) {
System.out.println(strLine + " does not match");
}
}
打印:
abc does not match
thing does not match
lol does not match
您可以使用Pattern.quote
:
public static Pattern patternOf(List<String> starts) {
StringBuilder b = new StringBuilder();
for (String start: starts) {
b.append("|").append(Pattern.quote(start));
}
return Pattern.compile("^(" + b.substring(1) + ").*");
}
// use it like this:
Matcher matcher = patternOf(Arrays.asList("//", "/*", "*", "{", "}")).matcher("");
// produces a pattern like: ^(\Q//\E|\Q/*\E|\Q*\E|\Q{\E|\Q}\E).*
答案 2 :(得分:0)
对于您正在进行的少量测试,这并非不合理。您正在消除循环或迭代器的开销,并且您正在消除正则表达式的解析和执行,如注释所示。
考虑对测试进行排序,以便首先列出四个字符串中最常见的一个。这样测试将尽快通过。
我不认为在宏观计划中这是一个大问题。访问文件将是您正在做的最慢的部分。少数字符串比较没什么。
答案 3 :(得分:0)
Apache Commons Lang很容易:StringUtils.startsWithAny
。
例如:
List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");
boolean startsWith = StringUtils.startsWithAny("{mystring}", messages.toArray(new String[messages.size()]));