在Java中将字符串解析为映射

在Java中将字符串解析为映射,java,parsing,Java,Parsing,有一条像绳子一样的线 {uniqueKey=test20745,content={acostumbrado={tf=1,df=1},al={tf=1,df=6945},ante={tf=1,df=42},co={tf=1,df=9187},ello={tf=1,df=2},está={tf=2,df=21},falcao={tf=1,df=105},guardia={tf=1,df=2},http={tf=1,df=9893},nada={tf=1,df=24},no={tf=1,df=2493

有一条像绳子一样的线

{uniqueKey=test20745,content={acostumbrado={tf=1,df=1},al={tf=1,df=6945},ante={tf=1,df=42},co={tf=1,df=9187},ello={tf=1,df=2},está={tf=2,df=21},falcao={tf=1,df=105},guardia={tf=1,df=2},http={tf=1,df=9893},nada={tf=1,df=24},no={tf=1,df=2493},osa={tf=1,df=429},para={tf=1,df=6382},partido={tf=1,df=50},pretorian={tf=1,df=1},que={tf=1,df=358},sebcfkeı={tf=1,df=1},su={tf=1,df=7368},t={tf=1,df=14423},tuvo={tf=1,df=3},un={tf=1,df=8511}}}
如何将该字符串解析为如下所示的映射(键、列表)

acostumbrado->tf=1,df=1
al ->tf=1,df=6945
ante ->tf=1,df=42
...
编辑:

所以我到现在为止做了什么

    String delims = "[{},]";
    HashMap<String, List<String>> valueMap = new HashMap<String, List<String>>();
    for (int i = 0; i < text.size(); i++) {
        String[] tokens = val.toString().split(delims);
        ArrayList<String> tfAndDfValues = new ArrayList<String>();
        tfAndDfValues.add(tokens[4].substring(3));
        tfAndDfValues.add(tokens[5].substring(3));
        if (valueMap.containsKey(removeLastChar(tokens[3]))) {
            valueMap.get(removeLastChar(tokens[3])).addAll(tfAndDfValues);
        } else {
            valueMap.put(removeLastChar(tokens[3]), tfAndDfValues);
        }
    }
String delims=“[{},]”;
HashMap valueMap=新的HashMap();
对于(int i=0;i
如果您的输入模式始终是唯一的,请尝试以下操作

    String delims = "[{},=]";
    Map map = new HashMap() ;
    String[] tokens = text.toString().split(delims);
    for( int i=5;i<tokens.length - 7;i = i+ 7) {
        map.put(tokens[i], tokens[i+2]+"->"+tokens[i+3]+","+tokens[i+4]+"->"+tokens[i+5]);
    }
    System.out.println(map);
String delims=“[{},=]”;
Map Map=newhashmap();
String[]tokens=text.toString().split(delims);
对于(inti=5;i您考虑过吗?参见用法示例:

public class StatePatternProgram {

    public static void main(String[] args) {
        String example = "{uniqueKey=test20745,content={acostumbrado={tf=1,df=1},al={tf=1,df=6945},ante={tf=1,df=42},co={tf=1,df=9187},ello={tf=1,df=2},está={tf=2,df=21},falcao={tf=1,df=105},guardia={tf=1,df=2},http={tf=1,df=9893},nada={tf=1,df=24},no={tf=1,df=2493},osa={tf=1,df=429},para={tf=1,df=6382},partido={tf=1,df=50},pretorian={tf=1,df=1},que={tf=1,df=358},sebcfkeı={tf=1,df=1},su={tf=1,df=7368},t={tf=1,df=14423},tuvo={tf=1,df=3},un={tf=1,df=8511}}}";
        ParseContext context = new ParseContext();
        Map<String, List<Integer>> map = context.parseContent(example);
        System.out.println(map);
    }
}

class ParseContext {

    private Map<String, List<Integer>> contentMap;

    private String currentKey;
    private List<Integer> currentList;

    private boolean continueParsing = true;
    private ParseState state = new StartParseState();

    public Map<String, List<Integer>> parseContent(String content) {
        StringTokenizer tokenizer = new StringTokenizer(content, "{}=,", true);
        while (continueParsing) {
            state.parse(tokenizer);
        }
        return contentMap;
    }

    interface ParseState {
        void parse(StringTokenizer tokenizer);
    }

    class StartParseState implements ParseState {
        @Override
        public void parse(StringTokenizer tokenizer) {
            while (tokenizer.hasMoreTokens()) {
                String token = tokenizer.nextToken();
                if (!"content".equals(token)) {
                    continue;
                }

                contentMap = new LinkedHashMap<String, List<Integer>>();

                tokenizer.nextToken();
                tokenizer.nextToken();

                state = new KeyParseState();
                break;
            }
        }
    }

    class KeyParseState implements ParseState {
        @Override
        public void parse(StringTokenizer tokenizer) {
            if (tokenizer.hasMoreTokens()) {
                String token = tokenizer.nextToken();
                if (",".equals(token)) {
                    token = tokenizer.nextToken();
                }
                if ("}".equals(token)) {
                    state = new EndParseState();
                    return;
                }
                currentKey = token;
                tokenizer.nextToken();
                state = new ListParseState();
            }
        }
    }

    class ListParseState implements ParseState {
        @Override
        public void parse(StringTokenizer tokenizer) {
            currentList = new ArrayList<Integer>();
            while (tokenizer.hasMoreTokens()) {
                String token = tokenizer.nextToken();
                if ("}".equals(token)) {
                    break;
                }
                if ("=".equals(token)) {
                    currentList.add(Integer.valueOf(tokenizer.nextToken()));
                }
            }
            contentMap.put(currentKey, currentList);
            state = new KeyParseState();
        }
    }

    class EndParseState implements ParseState {
        @Override
        public void parse(StringTokenizer tokenizer) {
            continueParsing = false;
        }
    }
}

此解决方案使用正则表达式组捕获:

private static final String SAMPLE = "{uniqueKey=test20745,content={acostumbrado={tf=1,df=1},al={tf=1,df=6945},ante={tf=1,df=42},co={tf=1,df=9187},ello={tf=1,df=2},está={tf=2,df=21},falcao={tf=1,df=105},guardia={tf=1,df=2},http={tf=1,df=9893},nada={tf=1,df=24},no={tf=1,df=2493},osa={tf=1,df=429},para={tf=1,df=6382},partido={tf=1,df=50},pretorian={tf=1,df=1},que={tf=1,df=358},sebcfkeı={tf=1,df=1},su={tf=1,df=7368},t={tf=1,df=14423},tuvo={tf=1,df=3},un={tf=1,df=8511}}}";

private static final String CONTENT = "(\\p{L}*)=\\{((tf=\\d*),(df=\\d*))\\}";

public static void main(String[] args) {
    Pattern p = Pattern.compile(CONTENT);
    Matcher m = p.matcher(SAMPLE);

    Map<String, List<String>> result = new HashMap<String, List<String>>();
    while (m.find()) {
        String key = m.group(1);

        List<String> values = new ArrayList<String>();
        values.add(m.group(3));
        values.add(m.group(4));

        result.put(key, values);
    }

    System.out.println(result);
}
[代码>私人静态最后一个字符串样本<<代码>私人静态最后一个私人静态最后一个字符串<<代码>私人静态最后一个私人静态最后一个字符串样本:{{码>私人静态最后一个静态最后一个字符串样本<{码>私人静态最后一个静态最后一个字符串样本:{公开码>私人静态最后一个私人静态静态静态最后一个字符串样本:{{{Uniquedididic=tf=1,tf=1,df 1,df=1,df 1,df=1,df=1},df 1},df=1,df=1},1,1},1},al,al,al,al,al,al,al,al,al,al,al,al={,al={,al,al={=1,al={tf=1,al={tf=1,al,al,al,al={,al,例如,osa={tf=1,df=429},para={tf=1,df=6382},partido={tf=1,df=50},pretorian={tf=1,df=1},que={tf=1,df=358},sebcfkeı={tf=1,df=1},su={tf=1,df=7368},t={tf=1,df=14423},tuvo={tf=1,df=3},un={tf=1,df=8511}”; 私有静态最终字符串CONTENT=“(\\p{L}*)=\{((tf=\\d*),(df=\\d*))\\}”; 公共静态void main(字符串[]args){ Pattern p=Pattern.compile(内容); 匹配器m=p.匹配器(样本); 映射结果=新的HashMap(); while(m.find()){ 字符串键=m.group(1); 列表值=新的ArrayList(); 添加(m组(3)); 添加(m组(4)); 结果。输入(键、值); } 系统输出打印项次(结果); }
欢迎使用Stack Overflow!我们鼓励您这样做。如果您有,请将其添加到问题中-如果没有,请先研究并尝试您的问题,然后再回来。好的,我已经尝试了一些东西,我正在添加。@jlordo:显然不是JSON。对不起,看得不够近;)我已经编辑并放置了我的代码。我很高兴能帮助您。我的实现只是一个使用示例。请随意改进;)
private static final String SAMPLE = "{uniqueKey=test20745,content={acostumbrado={tf=1,df=1},al={tf=1,df=6945},ante={tf=1,df=42},co={tf=1,df=9187},ello={tf=1,df=2},está={tf=2,df=21},falcao={tf=1,df=105},guardia={tf=1,df=2},http={tf=1,df=9893},nada={tf=1,df=24},no={tf=1,df=2493},osa={tf=1,df=429},para={tf=1,df=6382},partido={tf=1,df=50},pretorian={tf=1,df=1},que={tf=1,df=358},sebcfkeı={tf=1,df=1},su={tf=1,df=7368},t={tf=1,df=14423},tuvo={tf=1,df=3},un={tf=1,df=8511}}}";

private static final String CONTENT = "(\\p{L}*)=\\{((tf=\\d*),(df=\\d*))\\}";

public static void main(String[] args) {
    Pattern p = Pattern.compile(CONTENT);
    Matcher m = p.matcher(SAMPLE);

    Map<String, List<String>> result = new HashMap<String, List<String>>();
    while (m.find()) {
        String key = m.group(1);

        List<String> values = new ArrayList<String>();
        values.add(m.group(3));
        values.add(m.group(4));

        result.put(key, values);
    }

    System.out.println(result);
}