0

次のようなリストがあります。

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

次に、ファイルを読み取り、1 行ずつ調べます。行の先頭がリストにあるものと一致するかどうかを確認したいと思います。

私は以前にこのようにしていましたが、これは私がやろうとしていることを達成するための最も効率的な方法ではないようです:

/*
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

実行しているテストの数が少ないため、それは不合理ではありません。ループまたは反復子のオーバーヘッドを排除し、コメントで提案されているように、正規表現の解析と実行を排除しています。

4 つのストリングの中で最も一般的なストリングが最初にリストされるように、テストの順序を検討してください。そうすれば、テストはできるだけ早く合格します。

大局的に見れば、これは大したことではないと思います。ファイルへのアクセスは、作業の中で最も遅い部分です。一握りの文字列比較は何もありません。

于 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 に答える