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

如何将指定格式字符串数组转换为HashMap<String, List<String>>?

问题描述

给定字符串数组:

String[] strings =  {"game_2times",
                     "game_3times",
                     "game_4times",
                     "listy_bubenicek",
                     "listy_peneznieso"};

需要创建一个HashMap<String, List<String>>,将每个字符串按_分割为键和值,相同键对应的值存入同一个列表,最终期望结果:

"game"  ->  ["2times", "3times", "4times"]
"listy" ->  ["bubenicek", "peneznieso"]

尝试了以下代码但未得到正确结果:

for (String item: names) {
    for (int i = 0; i < names.length; i++) {
        ArrayList<String> c = new ArrayList<>();
        if(names[i].contains("game")) {
            c.add(item);
        }
        hashmap.put(item.split("_")[0],c);
    }
}
错误原因分析
  • 嵌套循环完全多余:外层已遍历每个元素,内层重复遍历数组会导致逻辑混乱、重复处理
  • 每次循环新建ArrayList:即使键已存在,新创建的列表会覆盖原有列表,最终每个键仅保留最后一次添加的元素
  • 判断逻辑错误:仅筛选含"game"的元素,忽略"listy"相关项,且错误地将整个item添加到列表,而非分割后的值部分
正确实现方式

方式一:基础循环实现

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

public class Main {
    public static void main(String[] args) {
        String[] strings = {"game_2times", "game_3times", "game_4times", "listy_bubenicek", "listy_peneznieso"};
        Map<String, List<String>> hashmap = new HashMap<>();

        for (String item : strings) {
            // 按"_"分割出键和值
            String[] parts = item.split("_");
            String key = parts[0];
            String value = parts[1];

            // 键不存在时创建新列表
            if (!hashmap.containsKey(key)) {
                hashmap.put(key, new ArrayList<>());
            }
            // 将值添加到对应键的列表中
            hashmap.get(key).add(value);
        }

        // 验证结果
        for (Map.Entry<String, List<String>> entry : hashmap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

方式二:Java 8+ 流式API实现

如果使用Java 8及以上版本,可采用更简洁的流式写法:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String[] strings = {"game_2times", "game_3times", "game_4times", "listy_bubenicek", "listy_peneznieso"};

        Map<String, List<String>> hashmap = List.of(strings)
                .stream()
                .map(item -> item.split("_"))
                .collect(Collectors.groupingBy(
                        parts -> parts[0], // 以分割后的第一部分为分组键
                        Collectors.mapping(parts -> parts[1], Collectors.toList()) // 收集分割后的第二部分为列表
                ));

        // 验证结果
        hashmap.forEach((key, value) -> System.out.println(key + " -> " + value));
    }
}

内容的提问来源于stack exchange,提问作者Patrik Daňo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:45:34