2011-09-16 102 views
3

我碰到一個字符串形式的服務器如下回應......一種有效的方法來解析下面的字符串?

value_one=3342342&value_two=456344445&value_three=235333223

什麼是解析這個的有效途徑?我能想出的一切都很混亂。上「&」,循環,分割上「=」

public static Map<String, String> getQueryMap(String query) 
{ 
    String[] params = query.split("&"); 
    Map<String, String> map = new HashMap<String, String>(); 
    for (String param : params) 
    { 
     String name = param.split("=")[0]; 
     String value = param.split("=")[1]; 
     map.put(name, value); 
    } 
    return map; 
} 
+6

用'&'分割,然後用'='分割? – Blindy

+0

我想將數值作爲關鍵值對的一部分發回。 – Skizit

+0

*「什麼是解析此問題的有效方法?」*在互聯網上向隨機陌生人請求爲您做這件事通常是'高效'的。 *「我能想出的一切都很麻煩。」*這導致了這個問題[「你試過了什麼?」](http://mattgemmell.com/2008/12/08/what-have-you-tried /)。 –

回答

6

拆分令牌每個由名稱和值對具有「 =「將它們分開。所以根據需要將它們分成「=」。除非你有其他要求,否則對我來說似乎很簡單。

+0

請原諒明顯,但String.split()每次都會編譯正則表達式。此外,你正在分割相同的字符串多次。 –

+0

@Eugene,夠公平的。我爲可讀性提出了過早的優化。 – Joe

0

第一分割一個「&」。這會給你串

0

幼稚的做法是隻使用String.split

String input = "value_one=3342342&value_two=456344445&value_three=235333223" 
String[] rawAttrs = input.split("&"); 

// Split each attribute into pairs - assume some sort of Pair class exists 
List<Pair<String, String>> attributes = new ArrayList<Pair<String, String>>(); 
for (String rawAttr : rawAttrs) { 
    String[] parts = rawAttrs.split("="); 
    attributes.add(new Pair<String, String>(parts[0], parts[1]); 
} 

這種方法不處理格式不正確的條目以及 - 更重要的是,它不認爲會發生什麼,如果屬性值的部分包括=&字符。這些反斜線逃脫了嗎?他們是否是URL編碼的?有沒有其他方式可以嵌入?

如果你可以保證這些值是整數,那麼這不會是一個問題,但你需要確保覆蓋所有的基礎。

+0

在另一個答案中看到我關於String.split()的評論。 –

1

如果您打算解析多個字符串,則反覆使用String.split()方法不是一個好主意,因爲它會每次重新編譯分割正則表達式。

Pattern ampPattern = Pattern.compile("&"); 
Pattern eqPattern = Pattern.compile("="); 
... 

Map<String, Long> results = new HashMap<String, Long>(); 
for (String param : ampPattern.split(input)) { 
    String[] pair = eqPattern.split(param); 
    results.put(pair[0], Long.valueOf(pair[1])); 
} 

然而,對於這樣一個簡單的輸入字符串這將是更有效率在所有不使用正則表達式,避免臨時的字符串數組的創建。也許是這樣的:

Map<String, Long> results = new HashMap<String, Long>(); 
int start = 0; 
int next; 
do { 
    next = input.indexOf('&', start); 
    int end = next == -1 ? input.length() : next; 
    int k = input.indexOf('=', start); 
    results.put(input.substring(start, k), Long.valueOf(input.substring(k + 1, end))); 
    start = next + 1; 
} while (next > -1); 

當然,如果你只解析這個字符串幾次,這樣的優化可能不值得。

+0

Upvote。爲了避免在這樣簡單的問題中使用正則表達式應該總是被授予。 – coolcfan

相關問題