如何在Java中交叉连接多个列表?

时间:2014-05-15 11:46:10

标签: java list arraylist

交叉连接概念与数据库交叉连接相同。我有多个列表,让我们说3开始,我必须加入列表如下:

List<E> l1: {a, b},
List<E> l2: {c, d},
List<E> l3: {e, f},

交叉连接应该产生:

List<E> l4 = {a, c, f},
List<E> l5 = {a, c, e},
List<E> l6 = {a, d, f},
List<E> l7 = {a, d, e},
List<E> l8 = {b, c, f},
List<E> l9 = {b, c, e},
List<E> l10 = {b, d, f},
List<E> l11= {b, d, e};

3个包含3个元素的列表将提供27个新列表。并且每个列表中的元素数量始终相同。

现在一种可能的解决方案是迭代三个for循环,然后添加到3个新列表。 有没有其他可能的方法来实现这一点,以便降低复杂性?

由于

3 个答案:

答案 0 :(得分:0)

以下代码适用于任何类型的指标。

static void joinList()
    {
        List l11 = new ArrayList();

        List l22 = new ArrayList();
        List l33 = new ArrayList();

        l11.add("a");
        l11.add("b");

        l22.add("c");
        l22.add("d");

        l33.add("e");
        l33.add("f");    

        List<List> crosslist = new ArrayList<List>();
        for(int i =0;i<l11.size();i++)
        {
            for(int j=0 ; j<l22.size();j++)
            {
                for(int k =0; k<l33.size();k++)
                {

                    List list = new ArrayList();
                    list.add(l11.get(i));
                    list.add(l22.get(j));
                    list.add(l33.get(k));

                    crosslist.add(list);

                }
            }
        }   
    }

答案 1 :(得分:0)

此代码适用于任何List<List<T>>参数。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class X {
    public static void main(String[] args) {
        List<List<String>> param = new ArrayList<List<String>>() {{
            add(Arrays.asList("A", "B"));
            add(Arrays.asList("C", "D"));
            add(Arrays.asList("E", "F"));
        }};
        for (List<String> l : getCross(param)) {
            System.out.println(l);
        }
    }

    public static <T> List<List<T>> getCross(List<List<T>> values) {
        List<List<T>> accumulator = new ArrayList<List<T>>();
        if (values.size() != 0) {
            List<T> comb = new ArrayList<T>();
            comb.addAll(Collections.<T>nCopies(values.size(), null));
            getCross(accumulator, 0, comb, values);
        }
        return accumulator;
    }

    private static <T> void getCross(List<List<T>> accumulator, int idx, List<T> combination, List<List<T>> param) {
        if (idx == combination.size()) {
            accumulator.add(new ArrayList<T>(combination));
        } else {
            for(T t : param.get(idx)) {
                combination.set(idx, t);
                getCross(accumulator, idx + 1, combination, param);
            }
        }
    }
}

答案 2 :(得分:0)

尝试我的解决方案,

您可以在此处使用您需要的列表。

public class Main{
    private void run() {
        List<String> l11 = new ArrayList<String>(){{add("a");add("b");}};
        List<String> l22 = new ArrayList<String>(){{add("c");add("d");}};
        List<String> l33 = new ArrayList<String>(){{add("e");add("f");}};

        crossJoin(l11, l22, l33);
    }

    public void crossJoin(List<String> ... lists) {
        for (List<String> list : lists) {
            mixList(list, lists);
        }
    }

    private void mixList(List<String> list, List<String>[] lists) {
        for (List<String> listSrt : lists) {
            if (listSrt == list) continue;
            for (String baseString : list) {
                System.out.print(baseString + " ");
                for (String outerStr : listSrt ) {
                    System.out.print(outerStr + " ");
                }
                System.out.println(" ");
            }
        }

    }


    public static void main(String[] args) {
        Main main = new Main();
        main.run();
    }
}