如何将字符串解析为映射

10

如何将类似 A=B&C=D&E=F 的字符串解析为映射(map)?

6个回答

31
我会使用 split。
String text = "A=B&C=D&E=F";
Map<String, String> map = new LinkedHashMap<String, String>();
for(String keyValue : text.split(" *& *")) {
   String[] pairs = keyValue.split(" *= *", 2);
   map.put(pairs[0], pairs.length == 1 ? "" : pairs[1]);
}

EDIT允许填充空格和带有=或无值的值。例如:

A = minus- & C=equals= & E==F

3
写相同代码的过程中,这部分取决于代码需要进行多少错误检查。这是玩具代码吗?是否需要处理格式不良的输入等问题?如果没有 "=",那么此处的代码将会导致数组下标异常,但在某些情况下可能正常运行。 - Tom Quarendon
它将处理值中的 = 而不是将其截断 ;) - Peter Lawrey

7

只需使用Guava Splitter

String src="A=B&C=D&E=F";
Map map= Splitter.on('&').withKeyValueSeparator('=').split(src);

5
public class TestMapParser {
    @Test
    public void testParsing() {
        Map<String, String> map = parseMap("A=B&C=D&E=F");
        Assert.assertTrue("contains key", map.containsKey("A"));
        Assert.assertEquals("contains value", "B", map.get("A"));

        Assert.assertTrue("contains key", map.containsKey("C"));
        Assert.assertEquals("contains value", "D", map.get("C"));

        Assert.assertTrue("contains key", map.containsKey("E"));
        Assert.assertEquals("contains value", "F", map.get("E"));
    }

    private Map<String, String> parseMap(final String input) {
        final Map<String, String> map = new HashMap<String, String>();
        for (String pair : input.split("&")) {
            String[] kv = pair.split("=");
            map.put(kv[0], kv[1]);
        }
        return map;
    }
}

2
String  t = A=B&C=D&E=F;
Map map = new HashMap();
String[] pairs = t.split("&");
//TODO 1) Learn generis 2) Use gnerics    
for (String pair : pairs)
{
    String[] kv = pair.split("=");
    map.put(kv[0], kv[1]);
}

2

使用StringTokenizerString.split()将字符串拆分为多个子串,以'&'为分隔符。对于每个子串再次使用'='进行拆分,将第一个部分作为键,第二个部分作为值。

也可以使用正则表达式实现,但问题简单到足以使用StringTokenizer解决。


0
使用流API,只需一句话就可以完成。
String  t = "A=B&C=D&E=F";
Map<String, String> map = Arrays.stream(t.split("&"))
.map(kv -> kv.split("="))
.collect(Collectors.toMap(kv -> kv[0], kv -> kv[1]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接