首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

求个算法,这要如何做

2013-07-04 
求个算法,这要怎么做求各位给个算法,这要如何去做(不要for嵌套)问题是这样:现有五个左右的list集合,每个集

求个算法,这要怎么做
求各位给个算法,这要如何去做(不要for嵌套)

问题是这样:现有五个左右的list集合,每个集合的大小不确定有可能size为0,现想得到把每个集合里的数据进行排列组合后的数据。

如图:

求个算法,这要如何做

现在得到

 ADG
 ADH
 ADI
 AEG
 AEH
 AEI
 ......

肯请各位请教下要如何去做? 算法 行业数据 排列组合
[解决办法]
递归

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Hello {
    private static List<String> result = new ArrayList<String>();

    public static void foo(List<List<String>> lists, int outerIndex) {
        if (result.size() == lists.size()) {
            System.out.println(result);
        }

        for (int oi = outerIndex; oi < lists.size(); ++oi) {
            List<String> temp = lists.get(oi);

            for (int ii =  0; ii < temp.size(); ++ii) {
                result.add(temp.get(ii));
                foo(lists, oi + 1);
                result.remove(result.size() - 1);
            }
        }
    }

    public static void main(String[] args) {
        // [[[1]]] 准备数据.
        List<String> l1 = new ArrayList<String>();


        List<String> l2 = new ArrayList<String>();
        List<String> l3 = new ArrayList<String>();
        List<String> l4 = new ArrayList<String>();

        l1.add("A");
        l1.add("B");
        l1.add("C");

        l2.add("D");
        l2.add("E");
        l2.add("F");

        l3.add("G");
        l3.add("H");
        l3.add("I");

        // [[[2]]] 把上面的list都加入到list里
        List<List<String>> lists = new ArrayList<List<String>>();

        lists.add(l1);
        lists.add(l2);
        lists.add(l4);
        lists.add(l3);

        // [[[3]]] 去掉空的list
        Iterator<List<String>> iter = lists.iterator();
        while (iter.hasNext()) {
            List<String> temp = iter.next();

            if (temp.size() == 0) {
                iter.remove();
            }
        }

        // [[[4]]] 递归函数.
        foo(lists, 0);
    }
}


[A, D, G]
[A, D, H]
[A, D, I]
[A, E, G]
[A, E, H]
[A, E, I]
[A, F, G]
[A, F, H]
[A, F, I]
[B, D, G]
[B, D, H]
[B, D, I]
[B, E, G]
[B, E, H]
[B, E, I]
[B, F, G]
[B, F, H]
[B, F, I]


[C, D, G]
[C, D, H]
[C, D, I]
[C, E, G]
[C, E, H]
[C, E, I]
[C, F, G]
[C, F, H]
[C, F, I]


[解决办法]
引用:
递归
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Hello {
    private static List<String> result = new ArrayList<String>();

    public static void foo(List<List<String>> lists, int outerIndex) {
        if (result.size() == lists.size()) {
            System.out.println(result);
        }

        for (int oi = outerIndex; oi < lists.size(); ++oi) {
            List<String> temp = lists.get(oi);

            for (int ii =  0; ii < temp.size(); ++ii) {
                result.add(temp.get(ii));
                foo(lists, oi + 1);
                result.remove(result.size() - 1);
            }
        }
    }

    public static void main(String[] args) {
        // [[[1]]] 准备数据.
        List<String> l1 = new ArrayList<String>();
        List<String> l2 = new ArrayList<String>();
        List<String> l3 = new ArrayList<String>();
        List<String> l4 = new ArrayList<String>();

        l1.add("A");
        l1.add("B");
        l1.add("C");



        l2.add("D");
        l2.add("E");
        l2.add("F");

        l3.add("G");
        l3.add("H");
        l3.add("I");

        // [[[2]]] 把上面的list都加入到list里
        List<List<String>> lists = new ArrayList<List<String>>();

        lists.add(l1);
        lists.add(l2);
        lists.add(l4);
        lists.add(l3);

        // [[[3]]] 去掉空的list
        Iterator<List<String>> iter = lists.iterator();
        while (iter.hasNext()) {
            List<String> temp = iter.next();

            if (temp.size() == 0) {
                iter.remove();
            }
        }

        // [[[4]]] 递归函数.
        foo(lists, 0);
    }
}


[A, D, G]
[A, D, H]
[A, D, I]
[A, E, G]
[A, E, H]
[A, E, I]
[A, F, G]
[A, F, H]
[A, F, I]
[B, D, G]
[B, D, H]
[B, D, I]
[B, E, G]
[B, E, H]
[B, E, I]
[B, F, G]
[B, F, H]
[B, F, I]
[C, D, G]
[C, D, H]
[C, D, I]
[C, E, G]
[C, E, H]
[C, E, I]
[C, F, G]
[C, F, H]

[C, F, I]

楼上正解,不过感觉写的有点复杂

热点排行