有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java字符串解析到HashMap

我有一个以下格式的输入字符串:

消息:id1:[label1:label2..:labelN]:id2:[label1:label2..:labelM]:id3:[label1:label2..:labelK]

它基本上是与标签集关联的ID。可以有任意数量的ID和与这些ID关联的标签

我希望能够解析此字符串并生成表单id的哈希映射->;用于稍后快速查找的标签

我想知道用java解析这条消息最有效的方法是什么


共 (3) 个答案

  1. # 1 楼答案

    像这样的东西应该适合你:

    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

  2. # 2 楼答案

    以下代码将满足您的要求

    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=[label1:label2:label3:label4],2=[label1:label2:label3],1=[label1:label2]}

    现场演示:http://ideone.com/HM7989

  3. # 3 楼答案

    考虑使用{a1}^{}

    如果你拿着你给的绳子:

    Message:id1:[label1:label2....:labelN]:id2:[label1:label2....:labelM]:id3:[label1:label2....:labelK]
    

    然后做{},你会得到:

    Message:id1:[label1:label2....:labelN
    :id2:[label1:label2....:labelM
    :id3:[label1:label2....:labelK
    

    如果你在[上对每一个进行循环分割,你会得到:

    Message:id1:     label1:label2....:labelN
    :id2:            label1:label2....:labelM
    :id3:            label1:label2....:labelK
    

    然后,可以从String[]中的第一个元素中解析id名称,从String中的第二个元素中解析labelname,并将其存储在Multimap

    如果你不想用番石榴,你也可以用Map<String, List<String>>