0

私の考えでは、これは簡単なことのように思えました... 座って入力を始めるまでは。

とにかく、文字列内の「タグ」を見つけて適切に置き換え、結果の文字列を出力するメソッドを書くことを任されました。関数宣言は次のようになります。

public String doStuff(String source, Map<Integer, String> replacementData)

各「タグ」は「<<>>」で囲まれた整数値になるという考え方です(したがって、正規表現は「. <<[0-9]+>>.」のようなものになります)。これらのタグの 1 つが で検出されたらsource、タグ内に含まれている整数をタグから取得し、タグを次の方法で置き換える必要があります。replacementData.get(I)

とにかく効率よくやりたい。どうすればいいのかわかりません。私は Pattern と Matcher を調べましたが、それが正しいルートではなかったと思います。String.indexOf などは非効率なので、使用したくありません (そうではありませんか?)。

アドバイスありがとう!

4

2 に答える 2

2

正規表現パターンとマッチャーを使用してこれを行う方法は、グループと呼ばれる整数をキャプチャし、それを使用して置き換えることです。あなたの問題の他の興味深い部分は、段階的な交換です。実行する必要のある一連の手順は、appendReplacementメソッドのjavadocに記載されています。

サンプルコード:

String str = "abc<<1>>def<<2>>ghi";
java.util.Map<Integer,String> replacementMap = new java.util.HashMap<Integer,String>() {
    {
        put(1," ONE ");
        put(2," TWO ");
    }
};
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("<<([0-9]+)>>");
java.util.regex.Matcher matcher = pattern.matcher(str);
int start = 0;
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb,replacementMap.get(Integer.parseInt(matcher.group(1))));
}
matcher.appendTail(sb);
System.out.println(sb.toString());

出力:abc ONE def TWO ghi

于 2012-04-07T00:32:50.187 に答える
0

単純な実装:

public String doStuff(String source, Map<Integer, String> replacementData){

    for( Map.Entry<Integer,String> entry : replacementData.entrySet() )
         source = source.replace("<<"+entry.getKey().toString()+">>", entry.getValue() );

    return source;
}

私にはそれほど非効率に見えません。より効率的にする唯一の方法は、文字列の 1 回のパスですべてを完了しようとすることですが、実際にはString.replace().

それにかかる作業の量を考慮して、この種の最適化は、プロファイラーがこれが実際のボトルネックであることを示した場合にのみ行うべきことのカテゴリに入れます。

PuneetによるMatcherベースの方法は、文字列を 1 回しか渡さないため、より優れています。

于 2012-04-07T00:04:32.030 に答える