Java穷举所有参数名称

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]]

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值