使用增强的for循环在Java中填充多维数组

时间:2017-03-08 09:20:18

标签: java arrays loops multidimensional-array

我希望你们都做得很好,所以我想问的是要理解这两个代码之间的区别:

第一个代码(使用增强的for循环填充multidim-array) - 不起作用

static char[][] battleBoard = new char[10][10];
public static void main(String[] args)
{


    for(char[] rows:battleBoard)
    {
        for(char column:rows)
        {
            column = '*';
        }
    }


}

如果我们尝试使用以下代码打印出数组(期望'*'被分配给数组中的每个元素) - 我们失败了(即它仍然是空的)!

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


    }

但另一方面我们有(打印时效果很好):

static char[][] battleBoard = new char[10][10];
public static void main(String[] args)
{


    for(char[] rows:battleBoard)
    {
        Arrays.fill(rows, '*');
    }

所以问题是:不是列,前面的代码块中的行代表新的变量 - 即Arrays.fill(rows,'*')不应该满足需要因为它填充((行char数组))但不是( (battleBoard char array));

提前帮助我!

3 个答案:

答案 0 :(得分:1)

第一种方法没有填充数组,因为在代码中

for (char column : rows) {
    column = '*';
}

将数组中的值复制到新变量column。然后,您只需为此变量分配一个新值,但数组中的元素保持不变。

方法Arrays.fill()不会复制值,而是直接在数组上运行。您可以使用此代码自行完成此操作(与Arrays.fill()基本相同):

for (int i = 0; i < battleBoard.length; i++) {
    for (int j = 0; j < battleBoard[i].length; j++) {
        battleBoard[i][j] = '*';
    }
}

答案 1 :(得分:0)

我要感谢SilverNak的回答。以下是我对答案(详细)的最终看法 - 对于正在搜索的人:

列与行之间的区别在于“列”是表示多维数组中单元格的单个基本变量(例如:battleBoard),但是当涉及“行”时,它是对象的引用变量(一维数组(比如:battleBoard [i]),其中i属于区间[0,battleBoard.length),当涉及到不同的引用x,y,z,其中y = x,z = y,则任意改变其中一个(比如说z) - 除了把它放到空 - 会影响所有其他因为它们引用同一个对象。 我用以下2代码块做了一个简单的比喻:

首先是我们使用原始变量(如前一个问题中的“列”)

int x = 3;
int y = 4;

y = x;
y = 10;
System.out.print(x + " ");
System.out.println(y);

结果将是打印3 10

- 注意:更改一个不会改变另一个,因为它们是彼此独立的副本。

第二个是我们使用引用变量(如前一个问题中的“行”)

int[] test1 = new int[5];
int[] test2 = test1;
test2[2] = 3;
System.out.print(Arrays.toString(test1) + " ");
System.out.print(Arrays.toString(test2));

结果将是打印[0, 0, 3, 0, 0] [0, 0, 3, 0, 0]

- 注意:改变一个会改变另一个因为实际的改变是对象(在我们的例子中是数组);和test1,test2只是对同一个对象(数组)的引用,它们不是彼此独立的副本。

答案 2 :(得分:0)

我认为这里的答案是复杂的。最简单的原因是在第一个代码中你使用for-each循环。此循环的目的是让您一次一个地引用数组中的每个元素。所以当你说

for(char column:rows){
    column = '*';
}

column是一个变量,它显示当前元素的值,实际上并不允许您对数组中的该元素进行写入。如果你希望它工作,你应该反过来循环,使用for-each打印和双for循环写入数组。此外,Arrays.fill()只是简单地说出了它所说的原因。