无法从循环获得所需的输出

时间:2017-03-30 22:27:58

标签: java

我试图从阵列中获得某种输出模式,但似乎无法得到我正在寻找的东西,现在确定原因。链接是所需的输出。抱歉,如果格式不好。数组大小由用户输入。

public class A3_Q2 { 

    int [][] pattern2 = new int[arraySize][arraySize];

    number = 1;
    int i;
    int j;
    int newNumber = arraySize-1;

    for (i = 0; i < arraySize; i++) 

    {

        if (i == 0)
        {

            for (j = 0; j < arraySize; j++)
            {
                pattern2[i][j] = number;
                System.out.printf("%3d", pattern2[i][j]);
                number++;
            }

        }

        else 
        {
            for(j = 0; j < i; j++)
            {
                pattern2[i][j] = number + newNumber;
                System.out.printf("%3d", pattern2[i][j]);
                newNumber++;
            }
            newNumber = arraySize-1;
            while(j < arraySize)
            {
                pattern2[i][j] = number;
                System.out.printf("%3d", pattern2[i][j]);
                number++;
                j++;
            }


        }
        System.out.println(""); 
   }

期望的输出:

  1  2  3  4  5
 10  6  7  8  9
 14 15 11 12 13
 18 19 20 16 17
 22 23 24 25 21

此图像显示突出显示的无序细胞:

Desired Output

2 个答案:

答案 0 :(得分:0)

无需单独处理特定行。值应使用可以使用模运算符普遍应用的公式计算。

这应该可以解决问题:

for (i = 0; i < arraySize; i++) {
    for (j = 0; j < arraySize; j++) {
        int value = i * arraySize + (j - i + arraySize + 1) % arraySize;
        if (value % arraySize == 0) {
            value += arraySize;
        }
        pattern2[i][j] = value;
        System.out.printf("%3d", pattern2[i][j]);
    }
    System.out.println("");
}

答案 1 :(得分:0)

正如我在评论中建议的那样,你一次尝试做太多事情,这使逻辑(和逻辑错误)很难看到。 将每个部分分解为自己的方法可以使事情更多更容易。

所有这些循环和条件隐藏了只需要三个任务:

  1. 创建网格。
  2. 填充网格。
  3. 打印网格。
  4. public static void main(final String[] args) {
        final int arraySize = 5;
        int[][] pattern = new int[arraySize][arraySize];
        fillPattern(pattern);
        printPattern(pattern);
        return;
    }
    

    奇怪的非顺序输出意味着&#34;填充网格&#34;对于一种方法来说,实际上是一项太大的任务。

    填充网格通常需要填充每一行。 网格还需要将每行的值向右旋转一次...... 比前一行多一个。 这与使用行填充网格无关,因此它是一些其他方法的问题。

    (我可以将rowStartValue强加到其他方法上,然后再考虑它。)

    private static void fillPattern(int[][] pattern) {
        final int rowCount = pattern.length;
        for (int rowOffset = 0; rowOffset < rowCount; rowOffset++) {
            final int[] row = pattern[rowOffset];
            // Numbers in grid start at 1, not 0.
            final int rowStartValue = rowOffset * row.length + 1;
            fillRow(row, rowOffset, rowStartValue);
        }
        return;
    }
    

    fillRow必须生成值并将其填入row。 制作价值观很容易; 唯一棘手的部分是决定把它们放在哪里。

    挑选目的地只需要两个操作员,所以我在这里做了。 由于没有人想知道row[some / weird * math % here]的含义,我通过将其保存为rowIndex变量来为计算命名。 如果它更复杂,我会将工作转移到rowIndex(...) 方法

    private static void fillRow(int[] row, final int offset, final int value) {
        for (int addend = 0; addend < row.length; addend++) {
            final int rowIndex = (offset + addend) % row.length;
            row[rowIndex] = value + addend;
        }
        return;
    }
    

    现在网格已满,打印很简单:

    private static void printPattern(final int[][] pattern) {
        for (final int[] row : pattern) {
            for (final int element : row) {
                System.out.printf("%3d", element);
            }
            System.out.println();
        }
        return;
    }
    

    ij等变量替换为rowoffset也有很大帮助。