1. 概述
本文我们将学习如何将非JSON格式的String或String数组转为了 Map 类型,以及如何处理重复的Key。
2. 单个字符串转换为Map
字符串中的键值对,需要以分隔符进行分割(如逗号、分号或等号)。
下面是示例代码:
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()
根据分隔符(这里是空格)分割字符串,然后用split("=")
提取键和值。除去前后空格,将结果添加到map中。
下面测试 convertStringToMap()
方法:
@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");
// String转Map
Map<String, String> resultMap = convertStringToMap(data);
// 对比结果
assertEquals(expectedMap, resultMap);
}
3. 将字符串数组转换为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;
}
在这个方法中,我们遍历字符串数组,对每个元素进行分割,得到键和值。然后,将结果添加到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);
}
4. 处理重复的Key
在某些情况下,字符串数组可能包含重复的键,我们需要在Map中为每个键存储多个关联值。为此,我们可以使用值为List类型的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];
// 如果Key已存在, 追加
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;
}
以下是测试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);
}
5. 总结
本文探讨了在Java中将字符串和字符串数组转换为映射的不同技术。我们涵盖了基础转换、处理重复键以及提供了JUnit测试示例,以确保实现的正确性。
理解这些转换技巧后,我们可以在Java应用中高效地处理基于键值对的数据。请根据项目的具体需求选择合适的转换方法。
如往常一样,本文的完整代码示例可在GitHub上找到:GitHub链接。