需求是这样的,一个2维数组,内容如下:
x = {{a,b,c},{1,2,3},{x,y,z}};类似这样的内容;
想要计算排列形成下面的数据:
a 1 x
a 1 y 
a 1 z 
a 2 x
a 2 y 
a 2 z 
a 3 x
a 3 y 
a 3 z
b 1 x
b 1 y 
b 1 z 
b 2 x 
b 2 y 
b 2 z 
b 3 x 
b 3 y 
b 3 z 
c 1 x 
c 1 y 
c 1 z 
c 2 x 
c 2 y 
c 2 z 
c 3 x 
c 3 y 
c 3 z 形成这样的列表输出。找到了一个java版本的算法。没看懂,大家帮忙看看。再下列是比较灵活的代码,动态的:
String[][] str = {{"a1", "a2", "a3", "a4"},
                        {"b1", "b2", "b3"},
                        {"c1", "c2"},
                        {"d1", "d2", "d3"}};    //这个str可以换成动态的二维数组,或者list[]
        int max = 1;
        for(int i = 0; i < str.length; i++){
            max *= str[i].length;
        }
        
        for(int i = 0; i < max; i++){
            String s = "";
            int temp = 1;      //注意这个temp的用法。
            for(int j = 0; j < str.length; j++){
                temp *= str[j].length;
                s += str[j][i / (max / temp) % str[j].length];
            }
            System.out.println("第 " + (i + 1) + " 个: " + s);
        }        System.out.println(max);

解决方案 »

  1.   

    我觉得就是三个for循环就可以解决的,第一个循环遍历第一行的元素,第二个第二行,第三个第三行,最后一个循环中打印三个位置的内容,换行。
      

  2.   

    x = {{a,b,c},{1,2,3},{x,y,z}};这是什么数据类型?
      

  3.   

    这就是一个简单的排列组合的问题,用for做循环就可以了,
      

  4.   

    x = [[a,b,c],[1,2,3],[x,y,z]];
    这样才对吧,不要把java里的写法放到js里不知道这是不是你要的结果
    var x = [["b",2,"d"],["a",1,"c"],["a",2,"3"],["b",1,"c"]],temp;
    x.sort(function(a,b){
        temp=a[0].localeCompare(b[0]);
        if(temp==0){
            temp=a[1]-b[1];
            if(temp==0)
                temp=a[2].localeCompare(b[2])
        }
        return temp;
    });for(var i=0;i<x.length;i++)
        document.write(x[i]+"<br/>");
      

  5.   

    把那个Java的算法稍微修改一下就可以直接用了。不过每台看明白具体是如何进行计算的。
    看明白的朋友帮忙给解释一下呗。
      

  6.   


    你这个是排序的算法。我的问题是进行排列组合。把2维数组中的每一个里面取出来一个。形成不重复的配列数据。利用那个java的就能实现。不过没太看懂是如何算的。
      

  7.   

    var x = [["a", "b", "c"], ["1", "2", "3"], ["x", "y", "z"]];
    var count = x.length;
    var indexs = [];
    var msg = "";
    for (var i = 0; i < count; i++) indexs.push(0);
    var temp = [];
    for (var i = 0; i < count; i++) temp.push(x[i][indexs[i]]);do {
        msg += temp.join(" ") + "\n";
        tryBreak = false;
        for (var i = count - 1; i >= 0; i--) {
            if (indexs[i] + 1 < x[i].length) {
               indexs[i]++;
               temp[i] = x[i][indexs[i]];
               for (j = i + 1; j < count; j++) {
                  indexs[j] = 0;
                  temp[j] = x[j][indexs[j]];
               }
               tryBreak = true;
               break;
            }
        }
    } while (tryBreak);
    alert(msg);
      

  8.   

    var str = [["a", "b", "c"], [1, 2, 3], ["x", "y", "z"]];
    var max = 1;
    for (var i = 0; i < str.length; i++) max *= str[i].length; // 很明显这是计算有多少种组合,组合数就是每列个数的乘积
    for (var i = 0; i < max; i++) {
        var s = "";
        var temp = 1;
        for (var j = 0; j < str.length; j++) {
            temp *= str[j].length; // 每一列的基数
            s += str[j][Math.floor(i / (max / temp) % str[j].length)]; // i / (max / temp) 去掉前一列的基数
        }
        document.write(s + "<br>"); 
    }
      

  9.   

    呵呵 我根据楼主的意思 写了个asp版本:<%
    Dim x,max,str,str_t,arr
    x =Array(Array("a","b","c","d"),Array("1","2","2"),Array("x","y","z"))
    max=1
    For i=0 To UBound(x)
    max=max * (UBound(x(i))+1)
    Next
    str_t=""
    Dim a,b,c
    a=0
    b=0
    c=0
    For i=1 to max
    str=x(0)(a) & "," & x(1)(b) & "," & x(2)(c)
    If InStr(str_t,str)=0 Then
    str_t=str_t & str & "|"
    End If
    c=(c+1) Mod (UBound(x(2))+1)
    If c=0 Then
    b=(b+1) Mod (UBound(x(1))+1)
    If b=0 Then
    a=(a+1) Mod (UBound(x(0))+1)
    End If
    End If
    Next
    str_t=Left(str_t,Len(str_t)-1)
    arr=Split(str_t,"|")
    For i=0 To UBound(arr)
    response.write arr(i) & "<br />"
    Next
    %>