面试题答案
一键面试解析思路
- 使用
StringTokenizer
首先按|
分割字符串,得到不同的外层分组。 - 对于每个外层分组,再使用
StringTokenizer
按:
分割,得到外层名称和内层字符串。 - 对于内层字符串,继续使用
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的优点
- 简单易用:
StringTokenizer
提供了一种简单直观的方式来按指定分隔符分割字符串,不需要复杂的正则表达式。 - 效率较高:在处理简单分隔符的情况下,
StringTokenizer
的性能较好,特别是对于多次分割操作。
使用StringTokenizer的缺点
- 功能有限:只能按固定分隔符分割字符串,对于复杂的正则表达式分隔场景无能为力。
- 不灵活:一旦创建
StringTokenizer
对象,分隔符就固定了,不能动态改变。 - 非线程安全:
StringTokenizer
不是线程安全的,在多线程环境下使用需要额外的同步机制。