笛卡尔乘积算法


import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 笛卡尔乘积算法
 *
 * @author Neo
 * @version 1.0
 * @since 2021/7/28 10:13
 */
public class DescartesUtils {


    /**
     * 笛卡尔乘积算法
     * 
     * 示例1:
     *      输入:[[1, 2], [a, b]]
     *      输出:[[1, a], [1, b], [2, a], [2, b]]
     * 示例2:
     *      输入:[[1, 2], [a, b], [A, B]]
     *      输出:[[1, a, A], [1, a, B], [1, b, A], [1, b, B], [2, a, A], [2, a, B], [2, b, A], [2, b, B]]
     * 
* * @param metadata 需要处理的元数据 * @param result 通过乘积转化后的数组 * @param layer 开始位置 * @param currentList 记录当前数组集合 * @author Neo * @since 2021/7/28 10:08 */
public static <T> void process(List<List<T>> metadata, List<List<T>> result, int layer, List<T> currentList) { if (layer < metadata.size() - 1) { if (metadata.get(layer).size() == 0) { process(metadata, result, layer + 1, currentList); } else { for (int i = 0; i < metadata.get(layer).size(); i++) { List<T> list = new ArrayList<>(currentList); list.add(metadata.get(layer).get(i)); process(metadata, result, layer + 1, list); } } } else if (layer == metadata.size() - 1) { if (metadata.get(layer).size() == 0) { result.add(currentList); } else { for (int i = 0; i < metadata.get(layer).size(); i++) { List<T> list = new ArrayList<>(currentList); list.add(metadata.get(layer).get(i)); result.add(list); } } } } /** * 笛卡尔乘积算法 *
     * 示例1:
     *      输入:[[1, 2], [a, b]]
     *      输出:[[1, a], [1, b], [2, a], [2, b]]
     * 示例2:
     *      输入:[[1, 2], [a, b], [A, B]]
     *      输出:[[1, a, A], [1, a, B], [1, b, A], [1, b, B], [2, a, A], [2, a, B], [2, b, A], [2, b, B]]
     * 
* * @param metadata 需要处理的元数据 * @author Neo * @since 2021/7/28 10:08 */
public static <T> List<List<T>> process(List<List<T>> metadata) { if (CollectionUtils.isEmpty(metadata)) { return Collections.EMPTY_LIST; } List<List<T>> result = new ArrayList<>(); process(metadata, result, 0, new ArrayList<>()); return result; } }

你可能感兴趣的:(常用工具类,算法,java,开发语言,笛卡尔乘积)