Java中如何从列表创建键为Integer、值为Set的TreeMap
解决TreeMap按首数字分组列表元素的问题
嘿,我来帮你搞定这个分组需求!其实实现起来很直观,核心就是遍历列表元素,提取每个元素的首数字作为键,把元素归类到对应键的集合里,而TreeMap会自动帮我们按整数键升序排列,完美匹配你的需求。
下面我给你两种实现方式,你可以根据自己的Java版本和习惯选择:
方式一:传统循环遍历(兼容所有Java版本)
这种方式逻辑清晰,适合新手理解:
import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.TreeMap; public class TreeMapGrouping { public static void main(String[] args) { // 输入的列表 List<String> inputList = List.of( "1 big 345", "1 small 223", "2 big 312", "1 small 116" ); // 初始化TreeMap,键是Integer,值是存储字符串的集合 TreeMap<Integer, Collection<String>> resultMap = new TreeMap<>(); // 遍历每个元素 for (String item : inputList) { // 提取首数字:按空格分割,取第一个部分转成Integer String firstPart = item.split(" ")[0]; Integer key = Integer.parseInt(firstPart); // 检查Map中是否已有该键 if (!resultMap.containsKey(key)) { // 没有的话,创建一个新的ArrayList存入 resultMap.put(key, new ArrayList<>()); } // 将当前元素加入对应键的集合 resultMap.get(key).add(item); } // 打印结果验证 resultMap.forEach((k, v) -> System.out.println(k + " -> " + v)); } }
运行后输出正好是你想要的结构:
1 -> [1 big 345, 1 small 223, 1 small 116] 2 -> [2 big 312]
方式二:Java 8+ Stream简化写法
如果你的项目用的是Java 8及以上,用Stream的Collectors.groupingBy可以一行搞定分组,还能直接指定用TreeMap存储:
import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; public class TreeMapGroupingStream { public static void main(String[] args) { List<String> inputList = List.of( "1 big 345", "1 small 223", "2 big 312", "1 small 116" ); // 用Stream分组,指定TreeMap作为实现类 TreeMap<Integer, List<String>> resultMap = inputList.stream() .collect(Collectors.groupingBy( // 提取键:分割字符串取首数字转Integer item -> Integer.parseInt(item.split(" ")[0]), // 指定结果用TreeMap存储 TreeMap::new, // 收集值为列表 Collectors.toList() )); // 打印结果 resultMap.forEach((k, v) -> System.out.println(k + " -> " + v)); } }
关键注意点
- 字符串提取数字的健壮性:如果你的输入字符串可能存在开头不是数字、有空格或者分割异常的情况,建议加个异常处理,比如用正则匹配开头的数字:
import java.util.regex.Pattern; // ... Pattern numPattern = Pattern.compile("^\\d+"); Integer key = null; for (String item : inputList) { var matcher = numPattern.matcher(item); if (matcher.find()) { key = Integer.parseInt(matcher.group()); // 后续分组逻辑... } else { // 处理不符合格式的元素,比如跳过或记录日志 System.out.println("跳过不符合格式的元素:" + item); } } - 集合类型选择:例子里用了ArrayList作为值的集合,如果你需要去重,可以换成
HashSet;如果要保持元素的插入顺序,LinkedHashSet或者ArrayList都可以。
内容的提问来源于stack exchange,提问作者Sean2148
相关产品推荐
相关产品推荐

