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版权协议,转载请附上原文出处链接和本声明。