package com.api.utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 穷举排列组合
*
* @author zhanqi
* @since 2020-11-23 12:37:39
*/
public class ExhaustiveUtils {
static class Item {
List<String> options;
public List<String> getOptions() {
return options;
}
public void setOptions(List<String> item) {
this.options = item;
}
}
public static void main(String[] args) {
Item mem = new Item();
mem.setOptions(Arrays.asList("","彩电", "冰箱"));
Item color = new Item();
color.setOptions(Arrays.asList("","白", "黑"));
Item channel = new Item();
channel.setOptions(Arrays.asList("","创维", "西门子"));
Item money = new Item();
money.setOptions(Arrays.asList("","20000", "30000"));
List<Item> itemList = Arrays.asList(mem, color, channel, money);
int startIndex = 0;
List<List<String>> list=new ArrayList<>();
List<String> result = exhaustive(itemList.get(startIndex), itemList, startIndex);
result.forEach(e ->{
String[] subs = e.split("-");
list.add(Arrays.asList(subs));
});
System.out.println(list);
}
/**
* 穷举
* @param first 第一个item
* @param itemList 所有item
* @param index 索引
* @return
*/
public static List<String> exhaustive(Item first, List<Item> itemList, int index) {
List<String> firstItem = first.getOptions();
List<String> ret = new ArrayList<>();
firstItem.forEach(item ->{
int nextIndex = index + 1;
if (nextIndex < itemList.size()) {
List<String> nextRet = exhaustive(itemList.get(nextIndex), itemList, nextIndex);
nextRet.forEach(str ->{
StringBuilder chain = new StringBuilder();
chain.append(item);
if(!item.equals("")&&!str.equals("")){
chain.append("-");
}
chain.append(str);
ret.add(chain.toString());
});
} else {
ret.add(item);
}
});
return ret;
}
}
运行结果
[[], [20000], [30000], [创维], [创维, 20000], [创维, 30000], [西门子], [西门子, 20000], [西门子, 30000], [白], [白, 20000], [白, 30000], [白, 创维], [白, 创维, 20000], [白, 创维, 30000], [白, 西门子], [白, 西门子, 20000], [白, 西门子, 30000], [黑], [黑, 20000], [黑, 30000], [黑, 创维], [黑, 创维, 20000], [黑, 创维, 30000], [黑, 西门子], [黑, 西门子, 20000], [黑, 西门子, 30000], [彩电], [彩电, 20000], [彩电, 30000], [彩电, 创维], [彩电, 创维, 20000], [彩电, 创维, 30000], [彩电, 西门子], [彩电, 西门子, 20000], [彩电, 西门子, 30000], [彩电, 白], [彩电, 白, 20000], [彩电, 白, 30000], [彩电, 白, 创维], [彩电, 白, 创维, 20000], [彩电, 白, 创维, 30000], [彩电, 白, 西门子], [彩电, 白, 西门子, 20000], [彩电, 白, 西门子, 30000], [彩电, 黑], [彩电, 黑, 20000], [彩电, 黑, 30000], [彩电, 黑, 创维], [彩电, 黑, 创维, 20000], [彩电, 黑, 创维, 30000], [彩电, 黑, 西门子], [彩电, 黑, 西门子, 20000], [彩电, 黑, 西门子, 30000], [冰箱], [冰箱, 20000], [冰箱, 30000], [冰箱, 创维], [冰箱, 创维, 20000], [冰箱, 创维, 30000], [冰箱, 西门子], [冰箱, 西门子, 20000], [冰箱, 西门子, 30000], [冰箱, 白], [冰箱, 白, 20000], [冰箱, 白, 30000], [冰箱, 白, 创维], [冰箱, 白, 创维, 20000], [冰箱, 白, 创维, 30000], [冰箱, 白, 西门子], [冰箱, 白, 西门子, 20000], [冰箱, 白, 西门子, 30000], [冰箱, 黑], [冰箱, 黑, 20000], [冰箱, 黑, 30000], [冰箱, 黑, 创维], [冰箱, 黑, 创维, 20000], [冰箱, 黑, 创维, 30000], [冰箱, 黑, 西门子], [冰箱, 黑, 西门子, 20000], [冰箱, 黑, 西门子, 30000]]