初学者Java数组问题

时间:2010-09-26 19:56:48

标签: java arrays

我正在尝试使用数组输出一个X的平方。正方形的对角线将填充'X',空心将填充空格'_'。

这是我得到的代码:

public static char[][] square(int z) {
    int size=5;
    char[][] myArr = new char[size][size];
    for (int c=0;c<size;c++)
        myArr[c][c]='X';
    for (int r=0;r<size;r++)
    {
        for (int col=size-1;col>=0;col--)//put X
        {
            myArr[r][col]='X';
        }
    }
    for(int count=0;count<size;count++){
        if (myArr[count][count]!='X')
            myArr[count][count]=' ';
    }

    return myArr;

}

这应该有效 - 我在纸上手动运行它,一切都应该没问题。问题是什么?

4 个答案:

答案 0 :(得分:4)

问题可能在于:

for (int r=0;r<size;r++)
{
    for (int col=size-1;col>=0;col--)//put X
    {
        myArr[r][col]='X';
    }
}

你在整个广场(尺寸*大小)上徘徊,而不只是画东北 - 西南对角线。

尝试将其替换为:

for (int r=0;r<size;r++)
{
    myArr[r][size - r] = 'X'
}

编辑:为了让您的代码更加紧凑:

public static char[][] square(int size) {
    char[][] myArr = new char[size][size];
    for (int c = 0; c < size; c++) {
        for (int r = 0; r < size; r++) {
            if ((c == r) || ( c == size - r)) {
                myArr[r][c] = 'X';
            } else { 
                myArr[r][c] = ' ';
            }
        }
    }
    return myArr;
}

答案 1 :(得分:1)

当您迭代循环时,您希望对角线为“x”。您可以通过最小化迭代次数来节省大量工作和代码。

public static char[][] square(int z) {
int size = z;
char[][] myArr = new char[size][size];

for(int i = 0;i < size;i++)
{
    for(int j = 0;j < size;j++)
    {
        if(i == j)
        {
             myArr[i][j] = 'X';
        }
        else if(i + j == size - 1)
        {
             myArr[i][j] = 'X';
        else
        {
             myArr[i][j] = " ";
        }
     }
}

return myArr;

}

答案 2 :(得分:0)

你的代码似乎有点过于复杂,所有那些ifs和聪明的循环 只需使用'background chars'填充数组,然后绘制对角线。

    char[][] myArr = new char[size][size];
    for (int i = 0; i < size; ++i) {
        Arrays.fill(myArr[i], ' ');
    }
    // now we have square filled with spaces

    // draw diagonal, like you did it
    for (int c = 0; c < size; c++) {
        myArr[c][c] = 'X';
        myArr[c][size - c - 1] = 'X';
    }

修改
更新为绘制两个对角线。

答案 3 :(得分:0)

第一个问题是,当您执行new char[size][size];时,在使用它之前,您仍应new每个char数组。

这可以轻松地与第一个for循环合并:

 for (int c=0;c<size;c++) {
    myArr[c] = new char[size]; // allocate the array
    myArr[c][c]='X';
 }

接下来算法不起作用,但这个算法会:

public static char[][] square (int z) {
    int size = z, cap=((size+1) /2);
    char[][] myArr = new char[size][size];
    for (int c = 0; c < cap; c++) { // iterate only half the array doing 4 positions per iteration
        myArr[c] = new char[size];
        myArr[size-c-1] = new char[size];
        Arrays.fill(myArr[size-c-1],' '); // make the new line blank
        Arrays.fill(myArr[c], ' '); // make the new line blank
        myArr[c][c] = 'X';  // top left to center
        myArr[size - c - 1][size-c-1] = 'X'; // bottom right to center
        myArr[size - c - 1][c] = 'X'; // bottom left to center
        myArr[c][size - c - 1] = 'X'; // top right to center
    }
    return myArr;
}

/** test square algorithm by printing it to System.out */
private static void testSquare () {
    char[][] sq = square(5);
    for (char[] l : sq) {
        System.out.println(new String(l));
    }
}