数据排列组合实现

时间:2024-10-13 17:34:41
package com.angel.ocean.utils; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Slf4j public class CombinationUtil { // 连接符 public static String COMMA = ":"; /** * 获取元素组合 * @param lists * @param index * @return */ public static List<String> getAllCombination(List<List<String>> lists, Integer index) { if(null == index) { index = 0; } List<String> result = new ArrayList<>(); generateCombinations(lists, index, new ArrayList<>(), data -> { // 这里处理每个生成的组合 result.add(listToString(data)); }); return result; } /** * list转字符串 * @param list * @return */ private static String listToString(List<String> list) { StringBuilder stringBuilder = new StringBuilder(); for (String data : list) { stringBuilder.append(data); stringBuilder.append(COMMA); } if(stringBuilder.length() > 0) { stringBuilder.setLength(stringBuilder.length() - 1); } return stringBuilder.toString(); } /** * 元素组合 * @param lists * @param index * @param current * @param action */ public static void generateCombinations(List<List<String>> lists, int index, List<String> current, Consumer<List<String>> action) { if (index == lists.size()) { // 所有列表都已遍历完毕,处理当前组合 action.accept(new ArrayList<>(current)); return; } List<String> sublist = lists.get(index); for (String item : sublist) { current.add(item); // 添加当前项到组合中 generateCombinations(lists, index + 1, current, action); // 递归处理下一个列表 current.remove(current.size() - 1); // 回溯,移除最后添加的项以尝试其他组合 } } // Java 8 引入的函数式接口,用于处理生成的组合 @FunctionalInterface interface Consumer<T> { void accept(T t); } }