Java实现集合的组合(从组合中取出K个元素进行组合的所有情况)

2023-05-16

1.利用递归进行取出数据:

 public static <T> List<List<T>> combinations(List<T> list, int k) {
        if (k == 0 || list.isEmpty()) {//去除K大于list.size的情况。即取出长度不足K时清除此list
            return Collections.emptyList();
        }
        if (k == 1) {//递归调用最后分成的都是1个1个的,从这里面取出元素
            return list.stream().map(e -> Stream.of(e).collect(toList())).collect(toList());
        }
        Map<Boolean, List<T>> headAndTail = split(list, 1);
        List<T> head = headAndTail.get(true);
        List<T> tail = headAndTail.get(false);
        List<List<T>> c1 = combinations(tail, (k - 1)).stream().map(e -> {
            List<T> l = new ArrayList<>();
            l.addAll(head);
            l.addAll(e);
            return l;
        }).collect(Collectors.toList());
        List<List<T>> c2 = combinations(tail, k);
        c1.addAll(c2);
        return c1;
    }

/**
*根据n将集合分成两组
**/
public static <T> Map<Boolean, List<T>> split(List<T> list, int n) {
        return IntStream
                .range(0, list.size())
                .mapToObj(i -> new SimpleEntry<>(i, list.get(i)))
                .collect(partitioningBy(entry -> entry.getKey() < n, mapping(SimpleEntry::getValue, toList())));
    }

2.测试用例如下:

 @Test
    public void shouldFindAllCombinationsOfSize2FromAListWithSize3() throws Exception {
        List<String> input = Stream.of("a", "b", "c").collect(toList());
        List<List<String>> combinations = P26.combinations(input, 2);
        System.out.println("2-->"+combinations.toString());
        assertThat(combinations, hasSize(3));
    }

3.测试结果如下:

2-->[[a, b], [a, c], [b, c]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现集合的组合(从组合中取出K个元素进行组合的所有情况) 的相关文章

随机推荐

  • Github第三方登录

    第三方登录的定义 所谓的第三方登录 xff0c 就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能 而这里的第三方平台 xff0c 一般是已经有大量用户的平台 xff0c 如国内的新浪微博 QQ空间 xff0c 外国
  • java并发之通过线程工厂创建线程

    通过线程工厂创建线程 ThreadFactory接口的Thread newThread Runnable r 方法 package chapter1 import util Sleeper import java util concurre
  • 日历签到

    知识点 xff1a GridView的使用 SQLite的使用 涉及文件 xff1a res gt layout gt activity main xml 主布局文件 res gt layout gt date xml 布局文件 src g
  • GridView布局

    如果是列表 xff08 单列多行形式 xff09 的使用ListView xff0c 如果是多行多列网状形式的优先使用GridView lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34
  • iOS 卡住在 Cloning spec repo 'cocoapods' from 'https://github.com/CocoaPods/Specs.git'

    1 概况 一般是第一次安装cocoapod后 使用pod install 或者 pod update等时候 终端显示 Cloning spec repo 39 cocoapods 39 from 39 https github com Co
  • Apple Developer App 出现 未知错误 的解决办法

    问题场景 部分开发者账号续费前需要下载developer App 来认证信息后才可完成续费在 34 我的 34 内登录后开始认证 点击继续loading一会后弹窗未知错误打电话问Apple客服 说不确定原因 解决办法 下列方法挨个尝试 均有
  • 什么是区块链之简单直白解释

    先看一下比较官方的释义 区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 区块链 xff08 Blockchain xff09 xff0c 是比特币的一个重要概念 xff0c 它本质上是一个去中心化的数据库
  • VSCode 代码自动对齐快捷键

    Mac Shift 43 Option 43 F Windows Shift 43 Alt 43 F
  • Error running ‘__rvm_make -j8‘ 错误处理(Mac M1 BigSur)

    安装rvm时出现的坑 xff0c 执行下面install 2 6 6 rvm install span class token number 2 6 span span class token punctuation span span c
  • mac Vim/Vi Insert模式 ESC 按键无效的解决办法

    问题描述 进入Insert 模式 编辑完成 xff0c 习惯性按 esc键退出编辑 xff0c 一直不好使 xff0c 各种组合键 43 Esc统统不好使 解决方案 xff1a ctrl 43 c
  • git reset 的灵活应用

    git reset 常用有三种方式 xff1a 方式影响说明git reset soft只回退 commit 操作影响最小 xff0c 重新 commit 即可git reset mixed回退 commit 和 add 操作默认方式 xf
  • Mac 连接显示器,外接显示器不出影像

    1 现象 转换头 xff0c 连接线已正确连接 xff1b 显示器电源等也亮 xff0c 且是已有视频信号的状态 xff1b 查看设置 显示器 xff0c 里面也显示识别出已连接外接显示器 2 解决办法 显示器支持的 最高刷新率 与 系统设
  • idea多模块打包

    多模块打包的办法有两个 1 在parent的pom下执行deploy 这样就会自动将父 pom以及子 module都发布到仓库 在模块中添加如下选项 lt distributionManagement gt lt repository gt
  • Xcode 模拟器如何录屏

    1 touch bar 录制图标 有touch bar的MacBook xff0c 模拟器为当前最前窗口事 xff0c touch bar 上点击录制图标即可 xff1b 2 快捷键 选中模拟器界面 xff0c command 43 R 3
  • iOS 组件中设置文件支持MRC

    1 设置该文件的Compiler Flags 为 fno objc arc 使用cocopods 加载此组件时 xff0c 在 Pods 下的 Build Phases 中的 Compile Sources目录中 找到想要设置的文件 xff
  • Null passed to a callee that requires a non-null argument 【iOS常见报错收集】

    1 问题描述 xff1a xcode提示如下 xff1a 2 问题原因 此处某参数未设置 Nullable xff0c 但是赋值了nil xff0c xcode自动提示防止nil导致异常 xff1b 3 解决办法 将此处有可能传入nil的参
  • win10扩展EFI分区

    Win10扩展EFI分区 由于需要在Win10上安装Ubuntu18 04双系统 xff0c 硬盘格式为GPT xff0c 安装过程中需要将Ubuntu的引导分区设置Win10的EFI分区 xff0c 但是win10的EFI分区装系统时默认
  • 桌面图标美化,图包分享

    图标修改教程 先放效果图 xff1a 直接进入正题 xff1a 此电脑 网络 回收站等 xff1a 桌面右键 gt 个性化 gt 主题 gt 相关的设置 gt 桌面图标设置 应用等 xff1a 右键应用 gt 属性 系统图标 xff0c 以
  • Spring注解原理的详细剖析与实现

    一 注解的基本概念和原理及其简单实用 注解 xff08 Annotation xff09 提供了一种安全的类似注释的机制 xff0c 为我们在代码中添加信息提供了一种形式化得方法 xff0c 使我们可以在稍后某个时刻方便的使用这些数据 xf
  • Java实现集合的组合(从组合中取出K个元素进行组合的所有情况)

    1 利用递归进行取出数据 span class hljs keyword public span static span class hljs subst lt span T span class hljs subst gt span sp