笛卡尔乘积算法


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 {


    /**
     * 笛卡尔乘积算法
     * <pre>
     * 示例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]]
     * </pre>
     *
     * @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);
                }
            }
        }
    }

    /**
     * 笛卡尔乘积算法
     * <pre>
     * 示例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]]
     * </pre>
     *
     * @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;
    }
}

版权声明:本文为after95原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。