0

我似乎无法让这段代码工作。我正在做的是用 2 位数字的所有可能组合填充一个数组(每个数字分别代表一个形状和颜色)。然后,我试图使用这个数组来填充一个 2d 数组,在该数组中我创建了前一个数组中包含的元素的所有可能组合。出于某种原因,我的二维数组充满了所有 '21' 而不是任何类型的组合。

如果需要,我可以在课堂上发布其余代码,但它相当长。此方法中的最后一个循环仅用于打印它们以进行测试,之后将被删除。

public void combinations()
{
    combinations = new int[numShapes*numColors];
    int index = 0;
    for(int l = 1; l <= numShapes; l++)
        for(int h = 1; h <= numColors; h++)
            if(index + 1 != combinations.length + 1)
                combinations[index++] = (l*10) + h;
            else
                break;

    int[][] combs = new int[(int)Math.pow((numShapes*numColors),numPositions)][numPositions];

    //Fills the array with all '21' , fix this
    int ind = 0;
    for(int f = 0; f < 16; f++)
        for(int i = 0; i < numShapes; i++)
            for(int j = 0; j < numColors; j++)
                if(ind != combs.length+1){
                    combs[ind] = new int[]{combinations[numShapes], combinations[numShapes], combinations[numColors]};
                    ind++;
                }
                else
                    break;

    for(int p = 0; p < 2; p++){
        for(int g = 0; g < 3; g++){
            System.out.print(testFormat(combs[p][g]/10, combs[p][g]%10) + " ");
        }
        System.out.println();
    }
}
4

1 回答 1

0
    int[][] combs = combinationsOf(combinations, 5);

    for (int i = 0 ; i < combs.length ; i++)
    {
        for(int j = 0 ; j < combs[i].length ; j++)
        {
            System.out.print(combs[i][j] + ", ");
        }
        System.out.println("");
    }


public static int[][] combinationsOf(int[] colorShape, int numPositions)
{
    int[][] combs = new int[(int)(Math.pow(colorShape.length, numPositions))][numPositions];

    int[] holding = new int[numPositions];
    for(int i = 0 ; i < numPositions ; i++)
    {
        holding[i]=0;
    }

    for(int i = 0 ; i < combs.length ; i++)
    {
        for(int j = 0 ; j < numPositions ; j++)
        {
            combs[i][j] = colorShape[holding[j]];   
        }
        incrementHolding(holding, colorShape.length);
    }
    return combs;
}

public static boolean incrementHolding(int[] holding, int max)
{
    for(int i = holding.length-1 ; i >= 0 ; i--)
    {
        if(holding[i]+1 == max)
        {
            if(i==0)
                return false;
            holding[i]=0;
        }
        else
        {
            holding[i]++;
            return true;
        }
    }
    return true;
}

这现在对我有用。虽然它有很多代码。并且需要一段时间才能运行。

注意:在 5 个位置,数组有 9,765,625 个元素。

于 2013-09-07T17:38:09.643 回答