通过结合嵌套表和复制单个值展开列表

问题描述 投票:1回答:1

我有一个包含字符串和其他名单列表。

例:

List<Object> valuesList = new ArrayList<Object>();
valuesList.add("v0");
valuesList.add(Arrays.asList("v11", "v12"));
valuesList.add(Arrays.asList("v21", "v22"));
valuesList.add("v3");

我要创建一个包含嵌套的列表和复制的组合简单的字符串成员的所有组合的字符串列表的一个新的列表。很抱歉,如果现在还不清楚,如果你看到了什么,我应该对上面的例子,列出清单,可以更清楚:

list 1: v0 v11 v21 v3
list 2: v0 v12 v21 v3
list 3: v0 v11 v22 v3
list 4: v0 v12 v22 v3
java combinatorics
1个回答
1
投票

下面应该做的伎俩,使用迭代的方法,以及使用List<List<String>>List<Object>代替:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        List<List<String>> baseLists = new ArrayList<>();
        baseLists.add(Arrays.asList("a01","a02"));
        baseLists.add(Arrays.asList("a11","a12"));
        baseLists.add(Arrays.asList("a21","a22","a23"));
        baseLists.add(Arrays.asList("a3"));
        System.out.println("Base lists: " + baseLists);
        List<List<String>> combinations = new ArrayList<>();
        // iterative solution
        baseLists.forEach(list -> {
                List<List<String>> newCombinations = new ArrayList();
                list.forEach(string -> {
                    List<List<String>> currentCombinations = new ArrayList();
                    // deep copy combinations
                    combinations.forEach(inlist -> currentCombinations.add(new ArrayList(inlist)));
                    if(currentCombinations.isEmpty()) {
                        currentCombinations.add(new ArrayList());
                    }
                    currentCombinations.forEach(inlist -> inlist.add(string));
                    newCombinations.addAll(currentCombinations);
                });
                combinations.clear();
                newCombinations.forEach(l -> combinations.add(l));
        });
        System.out.println("Combination lists: " + combinations);
    }
}

在这种情况下的输出是:

Base lists: [[a01, a02], [a11, a12], [a21, a22, a23], [a3]]
Combination lists: [[a01, a11, a21, a3], [a02, a11, a21, a3], [a01, a12, a21, a3], [a02, a12, a21, a3], [a01, a11, a22, a3], [a02, a11, a22, a3], [a01, a12, a22, a3], [a02, a12, a22, a3], [a01, a11, a23, a3], [a02, a11, a23, a3], [a01, a12, a23, a3], [a02, a12, a23, a3]]
© www.soinside.com 2019 - 2024. All rights reserved.