0

我有一个看起来像这样的列表:

List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");

然后我读入一个文件并逐行浏览它。我想检查该行的开头是否与列表中的任何内容匹配。

我之前就是这样做的,但这似乎不是完成我想要做的最有效的方法:

/*
if (!strLine.startsWith("//") && !strLine.startsWith("/*") && !strLine.startsWith("*")  && !strLine.startsWith("}") && !strLine.startsWith("{")) {
System.out.println(strLine);
}
*/

关于什么是最好的方法的任何建议?

4

4 回答 4

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");
}
于 2012-11-07T16:09:31.313 回答
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).*
于 2012-11-07T16:10:05.143 回答
0

对于您正在进行的少量测试,这并非不合理。您正在消除循环或迭代器的开销,并且您正在消除注释所建议的正则表达式的解析和执行。

考虑对测试进行排序,以便首先列出四个字符串中最常见的。这样测试将尽快通过。

我不认为在宏伟的计划中这有什么大不了的。访问文件将是你正在做的最慢的部分。少数字符串比较什么都不是。

于 2012-11-07T16:14:21.240 回答
0

使用 Apache Commons Lang 很容易:StringUtils.startsWithAny.

例如:

List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");
boolean startsWith = StringUtils.startsWithAny("{mystring}", messages.toArray(new String[messages.size()]));
于 2012-11-07T16:21:30.777 回答