You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:37:27