1

私はうまくいかないように見えるトリッキーな状態を持っています。指定された文字列 、"Hi [HandleKey], you have [Action]"およびを含むマップについて、マップmap<"HandleKey","Peter">内にキーが見つかった場合、角括弧とその中の単語を置き換えたいと思います。この場合、マップにはキー Action が含まれていません。文字列が返され"Hi Peter, you have [Action]"ます。

ここに私が取り組んでいるコードがあります:

private String messageFormatter(String tMessage, Map<String, String> messageMap)
{
  String formattedMsg = null;
  Set<String> keyset = messageMap.keySet();

  Iterator<String> keySetItr = keyset.iterator();
  String msgkey = null;
  boolean isFormatted = false;
  while (keySetItr.hasNext())
  {
    msgkey = keySetItr.next();
    if(t.contains(msgkey))
    {
      if(!isFormatted)
      {
        formattedMsg = tMessage.replaceAll("\\[", "").replaceAll("\\]", "");
        formattedMsg = formattedMsg.replaceAll(msgkey, messageMap.get(msgkey));
        isFormatted= true;
      }else 
      {
        formattedMsg = formattedMsg.replaceAll(msgkey, messageMap.get(msgkey));;
      } 
    }else 
    {
      formattedMsg=tMessage;
    }
  }
  return formattedMsg;
}

最後のelse部分が正しくありません。誰でもこれで私を助けてくれませんか。このコードは、一致するキーがマップに見つからない場合を除いて、すべてのケースで正常に機能します

4

3 に答える 3

1

この考えは大丈夫ですか?

正規表現を適用したり、 の間のものを抽出したりする代わりに[..]、マップ側で何らかのトリックを行うことができます。例えば

String s = "Hi [HandleKey], you have [Action]";
for(String k: yourMap.keySet()){
  s=s.replaceAll("\\["+k+"\\]",yourMap.get(k));
}
于 2013-02-19T23:57:36.893 に答える
1

でこれを行うことができますregex。ここに完全なサンプルコードがあります

public static void main(String[] args) {
    String str = "Hi [HandleKey], you have [Action] ";
    Hashtable<String, String> table = new Hashtable<String, String>();
    table.put("HandleKey", "Peter");

    Pattern pattern = Pattern.compile("\\[(\\w+)\\]");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        String key = matcher.group(1);
        if (table.containsKey(key)) {
            str = str.replaceFirst("\\[" + key + "\\]", table.get(key));
        }
    }
    System.out.println(str);
}

出力:

こんにちはピーター、あなたは[アクション]を持っています

これは、マップ サイズが既に大きいか大きくなっている場合にをループするよりも効率的であることに注意してください。Map

于 2013-02-19T23:44:26.880 に答える
0

上記の変更を最小限に抑えてキーがマップにない場合に処理するには、試してみてください

formattedMsg.replaceAll(msgkey, 
   (messageMap.containsKey(msgKey) ? messageMap.get(msgkey) : "[" + msgKey + "]"));

しかし、もう一度見てみると、メッセージマップからキーのセットを反復しているので、キーがマップに表示されないという問題は発生しませんか?

if(t.contains(msgKey))... への参照もありますが、 t が何であるかわかりません

書式設定された [msgKey] が見つからないときにテキストに含めたい場合、場合によってはそれらを元に戻したい場合、すべての "[" & "]" を置き換えるのは間違った方法のようです。

私は@iTechの提案を見て、正規表現があなたのためにもっとや​​ってくれるようにします

于 2013-02-19T23:44:18.270 に答える