java实现排列组合运算

排列组合运算,大家都不陌生吧:如果有3个集合来作排列组合运算,每个集合的元素个数分别为n1、n2、n3,则结果集的元素个数为n1 * n2 * n3。

我的实现思路是:

1)遍历每个集合

2)如果是第1次遍历,则直接把元素放入结果集中;反之,则把上次的结果集缓存一份,然后给缓存合集中的每个元素作后续拼接。代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class MyCollectionUtils {


    /**
     * 对集合作排列组合运算
     *
     * @param list       要运算的集合
     * @param mapper     每个元素转成String的规则
     * @param connectors 每个元素在结果集中的连接符号
     * @param <T>
     * @return
     */
    public static <T> List<String> combine(List<List<T>> list, Function<T, String> mapper, String connectors) {
        if (list == null || list.isEmpty()) {
            return new ArrayList<>();
        }

        //结果集
        List<String> resList = new ArrayList<>();
        //缓存上次的结果集,用来拼接新的元素
        List<String> cacheList = null;

        for (int i = 0; i < list.size(); i++) {
            if (i == 0) {
                resList.addAll(list.get(i).stream().map(mapper).collect(Collectors.toList()));
            } else {
                cacheList = new ArrayList<>(resList);

                List<T> ts = list.get(i);
                for (int j = 0; j < ts.size(); j++) {
                    T t = ts.get(j);
                    if (j == 0) {
                        resList = resList.stream().map(e -> e + connectors + mapper.apply(t)).collect(Collectors.toList());
                    } else {
                        resList.addAll(cacheList.stream().map(e -> e + connectors + mapper.apply(t)).collect(Collectors.toList()));
                    }

                }
            }
        }

        return resList;
    }

    public static void main(String[] args) {
        List list = new ArrayList();

        List list1 = new ArrayList();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        List list2 = new ArrayList();
        list2.add(4);
        list2.add(5);

        List list3 = new ArrayList();
        list3.add(6);
        list3.add(7);
        list3.add(8);

        list.add(list1);
        list.add(list2);
        list.add(list3);

        List<String> combine = combine(list, (e -> e.toString()), ",");
        for (String str : combine) {
            System.out.println(str);
        }
    }
}

程序输出:

1,4,6
2,4,6
3,4,6
1,5,6
2,5,6
3,5,6
1,4,7
2,4,7
3,4,7
1,5,7
2,5,7
3,5,7
1,4,8
2,4,8
3,4,8
1,5,8
2,5,8
3,5,8

明显符合预期,over~

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值