我希望你们都做得很好,所以我想问的是要理解这两个代码之间的区别:
第一个代码(使用增强的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));
提前帮助我!
答案 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()
只是简单地说出了它所说的原因。