如何按key将元素存入Map,实现重复key存储多个UUID值的需求
实现方案
Java标准库中Map的键默认唯一,重复调用put方法传入相同键时,新值会直接覆盖旧值,你设想的用Map<Integer, List<UUID>>存储的思路是正确的,具体实现可以参考以下方案:
方案1:JDK8及以上原生实现(无需引入第三方依赖)
computeIfAbsent方法可以简化空列表初始化逻辑,代码如下:
// 定义键自动排序、值为UUID列表的TreeMap final Map<Integer, List<UUID>> map = new TreeMap<>(); while (rowIterator.hasNext()) { // 实际使用时替换为你业务逻辑中动态获取的key和uuid值即可 map.computeIfAbsent(1, k -> new ArrayList<>()).add(UUID.fromString("610e9040-840c-48c5-aa64-f193ed896133")); map.computeIfAbsent(2, k -> new ArrayList<>()).add(UUID.fromString("4ff0055d-49a9-4e93-b960-ff70ae1007ce")); map.computeIfAbsent(3, k -> new ArrayList<>()).add(UUID.fromString("751c79ce-445c-406a-9787-a754857a259c")); map.computeIfAbsent(3, k -> new ArrayList<>()).add(UUID.fromString("dc721d77-509d-4bd3-8004-43a8daab5840")); map.computeIfAbsent(3, k -> new ArrayList<>()).add(UUID.fromString("4ca16aff-5a30-4638-8b38-3a93eddb0fc5")); map.computeIfAbsent(3, k -> new ArrayList<>()).add(UUID.fromString("e4be360b-cccb-42a2-b416-eb4bb623b49f")); }
computeIfAbsent会自动判断键是否存在:如果键不存在,就新建ArrayList存入Map后返回该列表;如果键已经存在,直接返回已有的列表,直接调用add方法添加元素即可。
方案2:JDK7及更早版本原生实现
如果使用低版本JDK不支持computeIfAbsent,手动做判空处理即可:
final Map<Integer, List<UUID>> map = new TreeMap<>(); while (rowIterator.hasNext()) { // 替换为动态获取的key和uuid Integer key = 3; UUID uuid = UUID.fromString("dc721d77-509d-4bd3-8004-43a8daab5840"); List<UUID> uuidList = map.get(key); if (uuidList == null) { uuidList = new ArrayList<>(); map.put(key, uuidList); } uuidList.add(uuid); }
方案3:基于Guava工具库实现
如果项目已经引入Guava依赖,可以直接使用TreeMultimap,无需手动维护列表:
final TreeMultimap<Integer, UUID> sortedMultimap = TreeMultimap.create(); // 直接put即可,相同键的元素会自动合并存入列表 sortedMultimap.put(3, UUID.fromString("751c79ce-445c-406a-9787-a754857a259c")); sortedMultimap.put(3, UUID.fromString("dc721d77-509d-4bd3-8004-43a8daab5840"));
注意:你示例代码中存在变量名笔误,定义的变量是
map,后续调用put方法时用的变量名是mapppp,实际编码时需要注意变量名统一。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

