1. 概述

在CSV(逗号分隔值)或自定义分隔数据中处理数据时,我们经常需要在Java中将字符串拆分为键值对。在这篇教程中,我们将探讨如何通过代码示例和解释来在Java中使用代码将文本分割成键值对。

2. 使用StringTokenizer

StringTokenizer类是将字符串根据提供的分隔符拆分成令牌的一种方法,用于将字符串拆分为键值对。

让我们看一个例子:

@Test
public void givenStringData_whenUsingTokenizer_thenTokenizeAndValidate() {
    String data = "name=John age=30 city=NewYork";
    StringTokenizer tokenizer = new StringTokenizer(data);

    // Create a map to store key-value pairs
    Map<String, String> keyValueMap = new HashMap<>();

    while (tokenizer.hasMoreTokens()) {
        String token = tokenizer.nextToken();
        String[] keyValue = token.split("=");

        if (keyValue.length == 2) {
            String key = keyValue[0];
            String value = keyValue[1];

            // Store key-value pairs in the map
            keyValueMap.put(key, value);
        }
    }

    // Use assertions to validate the key-value pairs in the map
    assertEquals("John", keyValueMap.get("name"));
    assertEquals("30", keyValueMap.get("age"));
    assertEquals("NewYork", keyValueMap.get("city"));
}

在这个例子中,创建StringTokenizer对象时,我们指定输入字符串数据和默认分隔符空格。然后,在遍历令牌后,我们使用等号(*)作为分隔符将每个令牌分开成键值对。

3. 使用正则表达式

使用PatternMatcher类的正则表达式是另一种将字符串拆分为键值对的方法。这种方法在处理各种分隔符和模式时提供了更大的灵活性。

举个例子:

@Test
public void givenDataWithPattern_whenUsingMatcher_thenPerformPatternMatching() {
    String data = "name=John,age=30;city=NewYork";
    Pattern pattern = Pattern.compile("\\b(\\w+)=(\\w+)\\b");
    Matcher matcher = pattern.matcher(data);

    // Create a map to store key-value pairs
    Map<String, String> keyValueMap = new HashMap<>();

    while (matcher.find()) {
        String key = matcher.group(1);
        String value = matcher.group(2);

        // Store key-value pairs in the map
        keyValueMap.put(key, value);
    }

    // Use assertions to validate the key-value pairs in the map
    assertEquals("John", keyValueMap.get("name"));
    assertEquals("30", keyValueMap.get("age"));
    assertEquals("NewYork", keyValueMap.get("city"));
}

在这个例子中,我们使用Pattern类生成一个正则表达式模式\\b(\\w+)=(\\w+)\\b,用于查找和提取文本中的键值对。它识别出由字母、数字或下划线组成的键后跟等号(*),并捕获与其关联的值,这些值同样由字母、数字或下划线组成。

注意,\\b标记确保找到完整的键值对,这使得这个正则表达式对于解析以"key=value"格式存储的结构化数据非常有用。

接着,使用输入字符串,我们使用Matcher来定位并提取这些对。

4. 使用Java流

如果你使用的是Java 8或更高版本,我们可以使用Java流来干净地将文本拆分为键值对。

看一个例子:

@Test
public void givenStringData_whenUsingJavaMap_thenSplitAndValidate() {
    String data = "name=John age=30 city=NewYork";
    Map<String, String> keyValueMap = Arrays.stream(data.split(" "))
      .map(kv -> kv.split("="))
      .filter(kvArray -> kvArray.length == 2)
      .collect(Collectors.toMap(kv -> kv[0], kv -> kv[1]));

    assertEquals("John", keyValueMap.get("name"));
    assertEquals("30", keyValueMap.get("age"));
    assertEquals("NewYork", keyValueMap.get("city"));
}

在这个例子中,我们使用空格作为分隔符将输入字符串拆分为键值对数组。然后,我们进一步使用等号(*)通过map操作拆分每个对。最后,我们移除不包含恰好两个元素的配对,并将剩余的配对编译成一个关联键和值的Map

5. 总结

Java流、StringTokenizer和正则表达式只是将Java字符串分割为键值对的几种方法。

我们的需求以及我们正在处理的数据格式的复杂性将决定我们选择的解决方案。了解这些策略后,我们可以在Java程序中有效地提取和处理存储在键值对中的数据。

如往常一样,本文的完整代码示例可在GitHub上找到:这里