如何将指定格式字符串数组转换为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
相关产品推荐
相关产品推荐

