MST

星途 面试题库

面试题:Java中StringTokenizer在复杂嵌套数据解析的应用

给定一个字符串,格式为'outer1:inner1;inner2:inner3|outer2:inner4;inner5',其中outer表示外层分组,inner表示内层元素,':'用于分隔外层和内层,';'用于分隔内层元素,'|'用于分隔不同的外层分组。请使用StringTokenizer解析该字符串,将结果以合理的数据结构存储并展示解析思路,说明在这种复杂场景下使用StringTokenizer的优缺点。
44.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

解析思路

  1. 使用 StringTokenizer 首先按 | 分割字符串,得到不同的外层分组。
  2. 对于每个外层分组,再使用 StringTokenizer: 分割,得到外层名称和内层字符串。
  3. 对于内层字符串,继续使用 StringTokenizer; 分割,得到内层元素。

代码实现

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class StringTokenizerExample {
    public static void main(String[] args) {
        String input = "outer1:inner1;inner2:inner3|outer2:inner4;inner5";
        Map<String, List<List<String>>> result = new HashMap<>();

        StringTokenizer outerTokenizer = new StringTokenizer(input, "|");
        while (outerTokenizer.hasMoreTokens()) {
            String outerGroup = outerTokenizer.nextToken();
            StringTokenizer innerTokenizer = new StringTokenizer(outerGroup, ":");
            String outerKey = innerTokenizer.nextToken();
            List<List<String>> innerList = new ArrayList<>();
            while (innerTokenizer.hasMoreTokens()) {
                String innerPart = innerTokenizer.nextToken();
                StringTokenizer elementTokenizer = new StringTokenizer(innerPart, ";");
                List<String> elementList = new ArrayList<>();
                while (elementTokenizer.hasMoreTokens()) {
                    elementList.add(elementTokenizer.nextToken());
                }
                innerList.add(elementList);
            }
            result.put(outerKey, innerList);
        }

        System.out.println(result);
    }
}

数据结构说明

使用 Map<String, List<List<String>>> 存储结果,外层 String 为外层分组名称,List<List<String>> 中第一层 List 对应每个外层分组下的内层部分,第二层 List 对应内层部分中的每个元素。

使用StringTokenizer的优点

  1. 简单易用StringTokenizer 提供了一种简单直观的方式来按指定分隔符分割字符串,不需要复杂的正则表达式。
  2. 效率较高:在处理简单分隔符的情况下,StringTokenizer 的性能较好,特别是对于多次分割操作。

使用StringTokenizer的缺点

  1. 功能有限:只能按固定分隔符分割字符串,对于复杂的正则表达式分隔场景无能为力。
  2. 不灵活:一旦创建 StringTokenizer 对象,分隔符就固定了,不能动态改变。
  3. 非线程安全StringTokenizer 不是线程安全的,在多线程环境下使用需要额外的同步机制。