美文网首页前后端相关
java-多个数组排列组合

java-多个数组排列组合

作者: 任未然 | 来源:发表于2020-07-28 16:07 被阅读0次

一. 场景

有多个数组:
["一层","二层","三层"...] , ["圆形","方形"...] ...
排列组合效果:
["一层","圆形"] , ["一层","方形"] , ["二层","圆形"] ...

二. 实现方法

import org.apache.commons.collections4.CollectionUtils;
import org.junit.Test;

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

public class  ArrayUtils {
    /**
     * 多个数组排列组合
     * @param list 原始list
     * @param <T> 数据类型
     * @return
     */
    private static <T> List<List<T>> getDescartes(List<List<T>> list) {
        List<List<T>> returnList = new ArrayList<>();
        descartesRecursive(list, 0, returnList, new ArrayList<T>());
        return returnList;
    }

    /**
     * 递归实现
     * 原理:从原始list的0开始依次遍历到最后
     *
     * @param originalList 原始list
     * @param position     当前递归在原始list的position
     * @param returnList   返回结果
     * @param cacheList    临时保存的list
     */
    private static <T> void descartesRecursive(List<List<T>> originalList, int position, List<List<T>> returnList, List<T> cacheList) {
        List<T> originalItemList = originalList.get(position);
        for (int i = 0; i < originalItemList.size(); i++) {
            //最后一个复用cacheList,节省内存
            List<T> childCacheList = (i == originalItemList.size() - 1) ? cacheList : new ArrayList<>(cacheList);
            childCacheList.add(originalItemList.get(i));
            if (position == originalList.size() - 1) {//遍历到最后退出递归
                returnList.add(childCacheList);
                continue;
            }
            descartesRecursive(originalList, position + 1, returnList, childCacheList);
        }
    }

    /**
     * 多个数组排列组合
     * @param list 原始list
     * @return
     */
    public static List<String> getPermutations(List<List<String>> list) {
        List<String> resultList = new ArrayList<>();
        List<List<String>> list1 = getDescartes(list);
        if(CollectionUtils.isNotEmpty(list1)){
            list1.forEach(temp->{
                String str = listToStr(temp);
                if (StringUtil.notEmpty(str)) {
                    resultList.add(listToStr(temp));
                }
            });
        }
        return resultList;
    }

    public static String listToStr(List<String> list){
        StringBuffer str = new StringBuffer();
        if(CollectionUtils.isNotEmpty(list)){
            list.forEach(temp->{
                str.append("[").append(temp).append("]");
            });
        }
        return str.toString();
    }

}

测试1

    @Test
    public void test1(){
        List<String> list1 = Arrays.asList("一层", "二层", "三层");
        List<String> list2 = Arrays.asList("圆形", "方形");
        ArrayList<List<String>> list3 = new ArrayList<>();
        list3.add(list1);
        list3.add(list2);
        List<String> descartes = getPermutations(list3);
        descartes.forEach(System.out::println);
    }

输出

[一层][圆形]
[一层][方形]
[二层][圆形]
[二层][方形]
[三层][圆形]
[三层][方形]

测试2

@Test
    public void test2(){
        List<String> list1 = Arrays.asList("一层", "二层", "三层");
        List<String> list2 = Arrays.asList("圆形", "方形");
        ArrayList<List<String>> list3 = new ArrayList<>();
        list3.add(list1);
        list3.add(list2);
        List<List<String>> descartes = getDescartes(list3);
        descartes.forEach(System.out::println);
    }

输出

[一层, 圆形]
[一层, 方形]
[二层, 圆形]
[二层, 方形]
[三层, 圆形]
[三层, 方形]

相关文章

  • java-多个数组排列组合

    一. 场景 有多个数组:["一层","二层","三层"...] , ["圆形","方形"...] ...排列组合效...

  • Java- 一维数组:

    Java- 一维数组: 使用语法 elementType[] arrayRefVar(元素类型[] 数组引用变量)...

  • iOS多个数组进行排列组合算法

    上次有朋友开发我的时候遇到需要将多个数组里面的字符串逐个进行排列组合,例如:数组1:@[@"1",@"2",@"3...

  • JS:数组排列组合

    JS:数组排列组合 原数组const source = [ ['black', 'white', 'red', ...

  • java-数组

    定义数组 创建一维数组 二维数组 二维数组分配值 打印数组

  • Java-数组

  • Java-数组

    数组的基本概念 数组的定义: Java中要求所有的数组元素具有相同的数据类型。因此在一个数组中,数组元素的类型是唯...

  • java-数组

    数组 数组的定义   数组就是一个容器(存储多个东西的器皿,抽屉)。 容器的特点   定长,固定数据类型 索引  ...

  • 整型数组排列组合输出最小值

    一、题目内容 题目描述 有一整型数组,现在进行全排列组合,获得排列组合后最小的一个数。 输入描述 第一行输入数组个...

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

网友评论

    本文标题:java-多个数组排列组合

    本文链接:https://www.haomeiwen.com/subject/mggfrktx.html