原问题:
有一个List对象,其中包含了n个List,这n个List中由包含不同数量的某种对象,每个List中的对象数量最少有一个,最多不限,如下的树型结构:
RootList--
          |_A List
                 |_A1
                 |_A2
          |_B List
                 |_B1
                 |_B2
                 |_B3
          |_C List
                 |_C1A List、B List、C List都是List,A1、A2、B1、B2、B3、C都是相同类的不同实例。
结果是从A List获取一个成员成员、从B List获取一个成员、从C List获取一个成员得到一个组合结果
这样不同下去,获得所有的组合,如上例子中的结果是:
A1 B1 C1
A1 B2 C1
A1 B3 C1
A2 B1 C1
A2 B2 C1
A2 B3 C1
谁能有好的算法得到这个结果集合。字符串分组方法答案:
List getCombination(List a){ 
        if(a.size()==1){
            return (List) a.get(0);
        }
        List first=(List) a.get(0);
        List left=getCombination(a.subList(1,a.size()));       
        List ret=new ArrayList();
        for(int i=0;i<first.size();i++){
            for(int j=0;j<left.size();j++){
                ret.add(String.valueOf(first.get(i))+left.get(j));
            }
        }
        return ret;
    }以上的方法可以解决字符串分组组合的问题,若将字符串换成对象,分组使用List,那就是返回的结果ret是包含多个List的嵌套List,而多个List中的一个就是一个分组,这样具体如何实现。

解决方案 »

  1.   


    import java.util.ArrayList;
    import java.util.List;public class CMN {
    List list; Object[] o; public CMN(List list) {
    this.list = list;
    o = new Object[list.size()]; }

    public void DFS(int index) {
    if (index == list.size()) {
    show(o);
    return;
    }
    List temp = (List) list.get(index);
    for (int i = 0; i < temp.size(); i++) {
    o[index] = temp.get(i); DFS(index + 1); }
    } private static void show(Object[] o) {
    for (int i = 0; i < o.length; i++) {
    System.out.print(o[i]);
    }
    System.out.println();
    } public static void main(String[] args) {
    List test = getTestData();
    CMN t = new CMN(test);
    t.DFS(0);
    } /**
     *  
     */
    private static List getTestData() {
    List test = new ArrayList();
    test.add(objects2List(new Object[] { new T("A1"), new T("A2") }));
    test.add(objects2List(new Object[] { new T("B1"), new T("B2"),
    new T("B3") }));
    test.add(objects2List(new Object[] { new T("C1") }));
    return test;
    } private static List objects2List(Object[] o) {
    List res = new ArrayList();
    for (int i = 0; i < o.length; i++) {
    res.add(o[i]);
    }
    return res;
    }}class T {
    private String name; public T(String name) {
    this.name = name;
    } public String toString() {
    return name;
    }
    }