【问题标题】:Convert int to int array [closed]将 int 转换为 int 数组 [关闭]
【发布时间】:2018-05-11 15:54:21
【问题描述】:

现在我有另一个问题。 我需要制作一个 CNF 公式并使用 3d 数组的整数映射。 现在我尝试使用这个任务,不同的是插入一个 3d 数组,而不是 2d。

我用列(其中是 2 星(**))做到了,它可以工作。

有了块(你可以看到 ********* 星星),日食说“无法将 fron int 转换为 []int”

为什么会这样写? 在“它没有的列”中。

我希望我是清楚的。

public static void encode(int sqrtN, int[][] hints, int[][][] map) {
    int[] vars = new int [sqrtN*sqrtN]; 
    int nVars = sqrtN*sqrtN*sqrtN*sqrtN*sqrtN*sqrtN;


**  //each cell in the columns gets a different value.**
    for(int i=0; i<sqrtN*sqrtN; i=i+1){
        for(int j=0; j<sqrtN*sqrtN; j=j+1) {
            for(int k=0; k<sqrtN*sqrtN; k=k+1) 
                vars[k] = columns(map)[i][k][j];

            SATSolver.addClauses(exactlyOne(vars));
        }   
    }

    *****//each cell in the blocks gets a different value.******
    for(int i=0; i<sqrtN*sqrtN; i=i+1){
        for(int j=0; j<sqrtN*sqrtN; j=j+1) {
            for(int k=0; k<sqrtN*sqrtN; k=k+1) 
                vars[k] = blocks(map,sqrtN)[i][k][j];

            SATSolver.addClauses(exactlyOne(vars));
        }   
    }
    //hints.
    int [] hintsSATS = new int[1];
    for (int i = 0; i < hints.length; i = i + 1) {
        hintsSATS[0] = varName(hints[i][0],hints[i][1],hints[i][2]-1,sqrtN*sqrtN);
        SATSolver.addClause(hintsSATS);
    }

}

 //A function to trunsfer to columns.
public static int[][][] columns (int[][][] matrix) {
    int[][][] columns = new int[matrix.length][matrix.length][matrix.length];
    for(int j=0; j<matrix.length; j= j+1){
        for(int i=0; i<matrix.length; i= i+1){
            columns[j][i] = matrix[i][j];
        }
    }
    return columns;
}

  ************  //A function to trunsfer to blocks.**********
public static int[][][] blocks (int[][][] matrix, int sqrtN) {  
    int[][][] blocks = matrix;
    for (int i = 0; i<matrix.length; i= i+1) {
        for (int j = 0; j<matrix.length; j= j+1) {
            blocks[i][j] = j%sqrtN+ i%sqrtN*sqrtN + 1;
        }
    }
    return blocks;
}




//The name of the variable.
public static int varName(int i, int j, int k, int n) {
    int varName = n*n*i+n*j+k+1;
    return varName;
}
    //functions for the CNF. Excactly one.

public static int[][] atLeastOne(int[] vars) {
    int [][] atLeastOne = new int [1][vars.length];
    atLeastOne[0] = vars;
    return atLeastOne;  
}

public static int[][] atMostOne(int[] vars) {
    int [][]atMostOne = new int[AmountOfArrays(vars.length)][2];
    int k = 0;
    for(int i= 0;i<vars.length;i= i+1){
        for( int j=i+1;j<vars.length;j= j+1){
            atMostOne[k][0] = -vars[i];
            atMostOne[k][1] = -vars[j];
            k=k+1;          
        }
    }
    return atMostOne;
}

public static int AmountOfArrays(int n){
    int counter = 0;
    for(int i= 0;i<n-1;i= i+1){
        for( int j=i+1;j<n;j= j+1){
            counter= counter+1;         
        }
    }
    return counter;
}

public static int[][] exactlyOne(int[] vars) {
    int [][] exactlyOne = new int [AmountOfArrays(vars.length)+1][vars.length];
    int [][]atLeastOne = new int [1][vars.length];
    atLeastOne = atLeastOne(vars);
    exactlyOne[0] = atLeastOne[0];
    for(int i=1; i<exactlyOne.length; i= i+1){
        int [][]atMostOne = atMostOne(vars);
        exactlyOne[i] = atMostOne[i-1];
    }
    return exactlyOne;
}

【问题讨论】:

  • 你能把代码缩小一点吗?
  • blocks 是 int[][][] 类型。然后 blocks[i][j] 只是 int[] 类型。可能您需要第三个循环来处理第三个维度。
  • minimal reproducible example 是您问题的关键...

标签: java arrays type-conversion


【解决方案1】:

问题在这里blocks[i][j] = j%sqrtN+ i%sqrtN*sqrtN + 1; blocks[i][j] 需要一个数组,但 j%sqrtN+ i%sqrtN*sqrtN + 1; 返回一个 int。

【讨论】:

    【解决方案2】:

    public static int[][][] blocks (int[][][] matrix, int sqrtN)方法中,你没有正确使用多数组matrix

    matrix -> int[][][]
    matrix[i] -> int[][]
    matrix[i][j] -> int[]
    matric[i][j][k] -> int
    

    因此,您需要添加一个循环来迭代一个数组维度,以便能够在单元格中设置int 值。

    for (int i = 0; i < matrix.length; ++i) {
        for (int j = 0; j < matrix[i].length; ++j) {
            for (int k = 0; k < matrix[i][j].length; ++k) {
                blocks[i][j][k] = ????
            }
        }
    }
    

    请注意,我使用了matrix[i].length,如果你的数组维度大小不一样,这样会更安全。

    【讨论】:

    • 那么为什么它在“public static int[][][] columns (int[][][] matrix)”函数中起作用?这是完全相同的想法。如果我没记错的话……
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多