在 Java 中將字符串或字符串數組轉換為 Map
一、簡介
處理基於鍵值的數據是各種 Java 應用程序中的常見需求。通常,數據以Strings
或String
數組的形式到達,因此必須將它們轉換為Maps
以進行高效處理。在相同的上下文中, Maps
提供了一種使用鍵值對訪問和操作數據的簡單方法,使它們成為此類場景的強大數據結構。
在本文中,我們將探索將Strings
和String
數組轉換為Maps
的不同技術。我們還將討論在將String
數組轉換為具有值列表的Maps
時如何處理重複鍵。此外,為了確保我們實施的正確性。
2. 將String
轉換為Map
當我們有一個帶有鍵值對的String
時,我們可以將其轉換為Map
。 String
中的鍵值對必須用分隔符分隔,分隔符可以是任何字符,例如逗號、分號或等號。
讓我們看下面的例子:
public Map<String, String> convertStringToMap(String data) {
Map<String, String> map = new HashMap<>();
StringTokenizer tokenizer = new StringTokenizer(data, " ");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
String[] keyValue = token.split("=");
map.put(keyValue[0], keyValue[1]);
}
return map;
}
在此方法中,我們使用StringTokenizer()
通過分隔符(本例中為逗號)分割String
,然後使用split(“=”)
提取鍵和值。生成的鍵值對將添加到Map
中。請注意,我們修剪標記以刪除任何前導或尾隨空格。
現在,我們將測試convertStringToMap()
方法,該方法接受包含鍵值對的String
並將其轉換為Map
,如下所示:
@Test
public void given_StringWithKeyValuePairs_whenUsing_convertStringToMap_thenMapCreated() {
String data = "name=John age=30 city=NewYork";
Map<String, String> expectedMap = new HashMap<>();
expectedMap.put("name", "John");
expectedMap.put("age", "30");
expectedMap.put("city", "NewYork");
Map<String, String> resultMap = convertStringToMap(data);
assertEquals(expectedMap, resultMap);
}
該測試方法首先定義一個示例輸入數據,它是一個帶有鍵值對的空格分隔字符串。然後它創建一個expectedMap
來表示轉換後的預期輸出。
測試通過調用convertStringToMap(data)
方法來獲取resultMap
中的實際結果。最後, assertEquals()
方法將expectedMap
與resultMap
進行比較,以確保轉換正確執行並且輸出Map
與預期的Map匹配。
3. 將數組String
轉換為Map
如果我們有一個Strings
數組,其中每個元素代表一個鍵值對,我們可以將其轉換為Map
:
public Map<String, String> convertStringArrayToMap(String[] data) {
Map<String, String> map = new HashMap<>();
for (String keyValue : data) {
String[] parts = keyValue.split("=");
map.put(parts[0], parts[1]);
}
return map;
}
在此方法中,我們迭代String
數組並將每個元素split
為鍵和值。接下來,將生成的鍵值對添加到 Map 中。
以下測試方法用於驗證convertStringArrayToMap()
方法:
@Test
public void given_StringArrayWithKeyValuePairs_whenUsing_convertStringArrayToMap_thenMapCreated() {
String[] data = {"name=John", "age=30", "city=NewYork"};
Map<String, String> expectedMap = new HashMap<>();
expectedMap.put("name", "John");
expectedMap.put("age", "30");
expectedMap.put("city", "NewYork");
Map<String, String> resultMap = convertStringArrayToMap(data);
assertEquals(expectedMap, resultMap);
}
該測試方法通過創建包含鍵值對的Strings
數組來準備示例輸入。然後,它生成一個expectedMap
來表示轉換後所需的輸出。
此外,它還調用convertStringArrayToMap(data)
方法來獲取存儲在resultMap
中的實際結果。最後,測試使用assertEquals()
來確保轉換正確並且輸出Map
與預期匹配。
4. 處理重複密鑰
在某些情況下, String
數組可能包含重複的鍵,我們可能需要在Map
中存儲與每個鍵關聯的多個值。為了實現這一點,我們可以使用帶有值列表的Map
,如下所示:
public Map<String, List<String>> convertStringArrayToMapWithDuplicates(String[] data) {
Map<String, List<String>> map = new HashMap<>();
for (String keyValue : data) {
String[] parts = keyValue.split("=");
String key = parts[0];
String value = parts[1];
if (map.containsKey(key)) {
List<String> valuesList = map.get(key);
valuesList.add(value);
} else {
List<String> valuesList = new ArrayList<>();
valuesList.add(value);
map.put(key, valuesList);
}
}
return map;
}
在此方法中,我們檢查Map
中是否已存在該鍵。如果是,我們將檢索現有的值列表並將新值附加到其中。否則,我們會在Map
中創建一個新條目,並使用包含該值的新列表。
以下測試方法旨在測試convertStringArrayToMapWithDuplicates()
:
@Test
public void given_StringArrayWithKeyValuePairsWithDuplicates_whenUsing_convertStringArrayToMapWithDuplicates_thenMapCreatedWithLists() {
String[] data = {"name=John", "age=30", "city=NewYork", "age=31"};
Map<String, List<String>> expectedMap = new HashMap<>();
expectedMap.put("name", Collections.singletonList("John"));
expectedMap.put("age", Arrays.asList("30", "31"));
expectedMap.put("city", Collections.singletonList("NewYork"));
Map<String, List<String>> resultMap = convertStringArrayToMapWithDuplicates(data);
assertEquals(expectedMap, resultMap);
}
測試方法定義了一個示例輸入數據,其中包含一些重複的鍵。然後它創建一個expectedMap
來表示轉換後的預期輸出。 expectedMap
包括輸入數據中重複的鍵的值列表。
測試通過調用convertStringArrayToMapWithDuplicates(data)
方法來獲取resultMap
中的實際結果。最後,使用assertEquals()
方法將expectedMap
與resultMap
進行比較,以確保轉換正確執行,並且帶有值Lists
的輸出Map
與預期匹配。
5. 結論
在本文中,我們探索了在 Java 中將Strings
和String
數組轉換為Maps
的不同技術。我們介紹了基本轉換、處理重複鍵,並提供了JUnit
測試示例以確保實現的正確性。
通過了解這些轉換技術,我們可以在 Java 應用程序中高效地處理基於鍵值的數據。請記住考慮我們項目的具體要求並相應地選擇合適的轉換方法。
與往常一樣,本文的完整代碼示例可以在 GitHub 上找到。