数据排列组合实现

打印 上一主题 下一主题

主题 1532|帖子 1532|积分 4596

示例

将以下几组数据 (“01”, “02”),(“A1”, “A2”, “A3”),(“B1”, “B2”),(“D1”, “D3”)排列组合成,如:01:A1:B11 样例数据。
实现

  1. package com.angel.ocean.utils;
  2. import lombok.extern.slf4j.Slf4j;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. @Slf4j
  7. public class CombinationUtil {
  8.     // 连接符
  9.     public static String COMMA = ":";
  10.     /**
  11.      * 获取元素组合
  12.      * @param lists
  13.      * @param index
  14.      * @return
  15.      */
  16.     public static List<String> getAllCombination(List<List<String>> lists, Integer index) {
  17.         if(null == index) {
  18.             index = 0;
  19.         }
  20.         List<String> result = new ArrayList<>();
  21.         generateCombinations(lists, index, new ArrayList<>(), data -> {
  22.             // 这里处理每个生成的组合
  23.             result.add(listToString(data));
  24.         });
  25.         return result;
  26.     }
  27.     /**
  28.      * list转字符串
  29.      * @param list
  30.      * @return
  31.      */
  32.     private static String listToString(List<String> list) {
  33.         StringBuilder stringBuilder = new StringBuilder();
  34.         for (String data : list) {
  35.             stringBuilder.append(data);
  36.             stringBuilder.append(COMMA);
  37.         }
  38.         if(stringBuilder.length() > 0) {
  39.             stringBuilder.setLength(stringBuilder.length() - 1);
  40.         }
  41.         return stringBuilder.toString();
  42.     }
  43.     /**
  44.      * 元素组合
  45.      * @param lists
  46.      * @param index
  47.      * @param current
  48.      * @param action
  49.      */
  50.     public static void generateCombinations(List<List<String>> lists, int index, List<String> current, Consumer<List<String>> action) {
  51.         if (index == lists.size()) {
  52.             // 所有列表都已遍历完毕,处理当前组合
  53.             action.accept(new ArrayList<>(current));
  54.             return;
  55.         }
  56.         List<String> sublist = lists.get(index);
  57.         for (String item : sublist) {
  58.             current.add(item); // 添加当前项到组合中
  59.             generateCombinations(lists, index + 1, current, action); // 递归处理下一个列表
  60.             current.remove(current.size() - 1); // 回溯,移除最后添加的项以尝试其他组合
  61.         }
  62.     }
  63.     // Java 8 引入的函数式接口,用于处理生成的组合
  64.     @FunctionalInterface
  65.     interface Consumer<T> {
  66.         void accept(T t);
  67.     }
  68. }
复制代码
验证

  1. public static void main(String[] args) {
  2.    List<List<String>> lists = Arrays.asList(
  3.             Arrays.asList("01", "02"),
  4.             Arrays.asList("A1", "A2", "A3"),
  5.             Arrays.asList("B1", "B2"),
  6.             Arrays.asList("D1", "D3")
  7.     );
  8.     List<String> list = getAllCombination(lists, 0);
  9.     for (String data : list) {
  10.         log.info("{}", data);
  11.     }
  12. }
复制代码
运行截图:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表