1

次の形式の入力文字列があります。

メッセージ:id1:[label1:label2....:labelN]:id2:[label1:label2....:labelM]:id3:[label1:label2....:labelK]...

基本的には、一連のラベルに関連付けられた ID です。任意の数の ID とそれらの ID に関連付けられたラベルが存在する可能性があります。

この文字列を解析し、id->labels 形式の HashMap を生成して、後ですばやく検索できるようにしたいと考えています。

Javaでこのメッセージを解析する最も効率的な方法は何だろうと思っていましたか?

4

3 に答える 3

2

このようなものがうまくいくはずです:

String str = "Message:id1:[label1:label2:labelN]:id2:[label1:label2:labelM]:id3:[label1:label2:labelK]";
Pattern p = Pattern.compile("([^:]+):\\[([^\\]]+)\\]");
Matcher m = p.matcher(str.substring(8));
Map<String, List<String>> idmap = new HashMap<String, List<String>>(); 
while (m.find()) {
    List<String> l = new ArrayList<String>();
    String[] tok = m.group(2).split(":");
    for (String t: tok)
        l.add(t);
    idmap.put(m.group(1), l);
}
System.out.printf("IdMap %s%n", idmap);

ライブデモ: http://ideone.com/EoieUt

于 2013-05-05T18:46:04.663 に答える
0

次のコードが要件を満たします。

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {

        public static void main(String[] args){
           String msg = "id1:[label1:label2]:id2:[label1:label2:label3]:id3:[label1:label2:label3:label4]";
           Pattern pattern = Pattern.compile("id");
            HashMap<String,String> kv = new HashMap<String,String>();
            Matcher m = pattern.matcher(msg);

            int prev = -1;
            int next = -1;
            int start = -1;
            int end = -1;

            String subMsg = "";
            while (m.find()){
                if(prev == -1){
                    prev = m.end();
                }
                else
                {
                    next = m.end();
                    start = prev;
                    end =   next;
                    subMsg = msg.substring(start,end);
                    kv.put(String.valueOf(subMsg.charAt(0)),subMsg.substring(subMsg.indexOf("["),subMsg.lastIndexOf("]")+1));
                    prev = next;
                }
            }
            subMsg = msg.substring(next);
            kv.put(String.valueOf(subMsg.charAt(0)),subMsg.substring(subMsg.indexOf("["),subMsg.lastIndexOf("]")+1));

            System.out.println(kv);
        }
}

出力: {3=[ラベル1:ラベル2:ラベル3:ラベル4], 2=[ラベル1:ラベル2:ラベル3], 1=[ラベル1:ラベル2]}

ライブデモ : http://ideone.com/HM7989

于 2013-05-05T19:49:33.753 に答える