Java中ArrayList内字符串的字符组合生成(集合乘积形式)
解决ArrayList字符组合生成(去重版)
嘿,这个需求本质上就是求多个字符串的笛卡尔积,还要自动去重对吧?咱们可以用迭代的方式来实现,既直观又能避免递归可能带来的栈溢出问题,而且用Set天然就能帮咱们搞定重复组合的问题。
核心思路
- 用
Set<String>存储中间和最终的组合,Set会自动忽略重复元素,完美满足无重复要求。 - 遍历ArrayList中的每一个字符串,每次把已有的组合和当前字符串的每个字符拼接,生成新的组合集合,逐步构建最终结果。
- 处理边界情况:如果ArrayList为空,或者其中某个字符串为空,直接返回空集合(因为没法生成符合长度要求的组合)。
Java代码实现
import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class StringCombinationGenerator { public static Set<String> generateUniqueCombinations(ArrayList<String> inputList) { Set<String> combinations = new HashSet<>(); // 边界情况处理:输入为空或包含空字符串 if (inputList == null || inputList.isEmpty()) { return combinations; } for (String s : inputList) { if (s == null || s.isEmpty()) { return new HashSet<>(); } } // 初始化第一个字符串的字符作为初始组合 String firstStr = inputList.get(0); for (char c : firstStr.toCharArray()) { combinations.add(String.valueOf(c)); } // 迭代处理后续每个字符串 for (int i = 1; i < inputList.size(); i++) { Set<String> tempSet = new HashSet<>(); String currentStr = inputList.get(i); // 把已有组合和当前字符串的每个字符拼接 for (String combo : combinations) { for (char c : currentStr.toCharArray()) { tempSet.add(combo + c); } } // 更新组合集合为新生成的集合 combinations = tempSet; } return combinations; } // 测试用例 public static void main(String[] args) { ArrayList<String> input = new ArrayList<>(); input.add("ab"); input.add("cd"); input.add("aa"); // 故意加重复字符测试去重 Set<String> result = generateUniqueCombinations(input); System.out.println("生成的无重复组合:"); for (String combo : result) { System.out.println(combo); } // 输出会自动去重,最终只有4种组合而非8种 } }
代码说明
- 初始化阶段:把第一个字符串的每个字符作为初始的单字符组合,存入Set。
- 迭代阶段:每处理一个新字符串,就把之前所有的组合和当前字符串的每个字符拼接,生成新的组合存入临时Set,然后替换原Set,逐步构建出长度等于ArrayList大小的组合。
- 去重逻辑:全程用
HashSet存储,不管是中间步骤还是最终结果,重复的组合都会被自动过滤掉。
额外提示
如果需要把最终结果转换成List或者直接打印,只需要对返回的Set做相应转换即可,比如new ArrayList<>(combinations)。
内容的提问来源于stack exchange,提问作者Raghavendra
相关产品推荐
相关产品推荐

