如何基于LinkedHashMap生成保持条目顺序的字符串全组合
实现思路
- 先将LinkedHashMap的entry转换为有序列表,完全保留Map原有插入顺序
- 初始化结果列表,初始值仅包含1个空字符串,作为拼接的起始基准
- 按顺序遍历每个entry:
- 对当前结果列表中的每一个已有字符串,分别拼接当前entry的key和value,生成新的字符串
- 用新生成的所有字符串替换原结果列表,进入下一个entry的处理
- 遍历完所有entry后,结果列表就是所有符合要求的组合
Java 代码实现(迭代版,易理解无栈溢出风险)
import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class CombinationGenerator { public static List<String> generateAllCombinations(LinkedHashMap<String, String> map) { // 把entry转成有序列表,保证顺序和Map完全一致 List<Map.Entry<String, String>> entryList = new ArrayList<>(map.entrySet()); List<String> result = new ArrayList<>(); // 初始值为空串,方便后续拼接 result.add(""); for (Map.Entry<String, String> entry : entryList) { List<String> temp = new ArrayList<>(); String key = entry.getKey(); String value = entry.getValue(); // 已有每个字符串都分别拼接key和value for (String s : result) { temp.add(s + key); temp.add(s + value); } // 替换结果列表进入下一轮处理 result = temp; } return result; } // 测试用例 public static void main(String[] args) { // 测试示例1 LinkedHashMap<String, String> map1 = new LinkedHashMap<>(); map1.put("a", "ab"); map1.put("b", "c"); System.out.println("示例1输出:"); generateAllCombinations(map1).forEach(System.out::println); // 测试示例2 LinkedHashMap<String, String> map2 = new LinkedHashMap<>(); map2.put("A", "a"); map2.put("B", "b"); System.out.println("\n示例2输出:"); generateAllCombinations(map2).forEach(System.out::println); } }
递归实现(可选)
如果偏好递归写法,可以参考如下逻辑:
private static void dfs(List<Map.Entry<String, String>> entryList, int index, String current, List<String> result) { // 所有entry处理完成,将当前拼接结果加入列表 if (index == entryList.size()) { result.add(current); return; } Map.Entry<String, String> entry = entryList.get(index); // 选择当前entry的key,递归处理下一个条目 dfs(entryList, index + 1, current + entry.getKey(), result); // 选择当前entry的value,递归处理下一个条目 dfs(entryList, index + 1, current + entry.getValue(), result); }
调用时先转换得到entry有序列表,初始化空的结果列表,传入index=0、current=""即可。
内容的提问来源于stack exchange,提问作者LoneLearner
相关产品推荐
相关产品推荐

