2011-03-01 34 views

回答

23

我會用分裂

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 
+2

+1。在編寫相同的代碼的過程中。部分取決於檢查代碼需要做多少錯誤。這是玩具代碼嗎?這是否需要複製嚴重形成的輸入等?這裏代碼會給arrayIndexException如果沒有「=」的例子,但可能是在方案中就好了。 – 2011-03-01 10:39:59

+0

它將處理的'='中的值,而不是斬波其關閉;) – 2011-03-01 10:42:56

+0

@湯姆,謝謝,增加了一些錯誤處理。 – 2011-03-01 10:45:50

1
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很簡單。

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; 
    } 
} 
4

只是用番石榴分配器

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