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

Java中ArrayList内字符串的字符组合生成(集合乘积形式)

解决ArrayList字符组合生成(去重版)

嘿,这个需求本质上就是求多个字符串的笛卡尔积,还要自动去重对吧?咱们可以用迭代的方式来实现,既直观又能避免递归可能带来的栈溢出问题,而且用Set天然就能帮咱们搞定重复组合的问题。

核心思路

  1. 用Set<String>存储中间和最终的组合,Set会自动忽略重复元素,完美满足无重复要求。
  2. 遍历ArrayList中的每一个字符串,每次把已有的组合和当前字符串的每个字符拼接,生成新的组合集合,逐步构建最终结果。
  3. 处理边界情况:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:10:43