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链接