使用递归实现各种组合实现

题目:
手机内存:16G,32G
手机颜色:红,黑
手机渠道:国行,港行

要求列出所有组合,16G/红/国行,16G/黑/国行...
package com.example.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 排列组合
 */
public class CombinationTest {

    static class Item {
        List<String> options;

        public List<String> getOptions() {
            return options;
        }

        public void setOptions(List<String> item) {
            this.options = item;
        }
    }

    /**
     * <pre>
     * 题目:
     * 手机内存:16G,32G
     * 手机颜色:红,黑
     * 手机渠道:国行,港行
     * 
     * 要求列出所有组合,16G/红/国行,16G/黑/国行...
     * </pre>
     */
    public static void main(String[] args) {
        Item mem = new Item();
        mem.setOptions(Arrays.asList("16G", "32G"));

        Item color = new Item();
        color.setOptions(Arrays.asList("红", "黑"));

        Item channel = new Item();
        channel.setOptions(Arrays.asList("国行", "港行"));

        List<Item> itemList = Arrays.asList(mem, color, channel);

        int startIndex = 0;
        List<String> result = combine(itemList.get(startIndex), itemList, startIndex);
        System.out.println(result); 
        /*
         [16G/红/国行, 16G/红/港行, 16G/黑/国行, 16G/黑/港行, 32G/红/国行, 32G/红/港行, 32G/黑/国行, 32G/黑/港行]
         */

    }

    /**
     * 递归算法
     * @param first 第一个item
     * @param itemList 所有item
     * @param index 索引
     * @return 返回当前Item具备的组合
     */
    public static List<String> combine(Item first, List<Item> itemList, int index) {
        List<String> firstItem = first.getOptions();
        List<String> ret = new ArrayList<>();
        for (String item : firstItem) {
            int nextIndex = index + 1;
            if (nextIndex < itemList.size()) {
                List<String> nextRet = combine(itemList.get(nextIndex), itemList, nextIndex);
                for (String string : nextRet) {
                    StringBuilder chain = new StringBuilder();
                    chain.append(item).append("/").append(string);
                    ret.add(chain.toString());
                }
            } else {
                ret.add(item);
            }
        }
        return ret;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值