Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用增强的for循环在Java中填充多维数组_Java_Arrays_Loops_Multidimensional Array - Fatal编程技术网

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

使用增强的for循环在Java中填充多维数组,java,arrays,loops,multidimensional-array,Java,Arrays,Loops,Multidimensional Array,我希望你们都做得很好,所以我想问题在于理解这两种代码之间的区别: 第一个代码(使用增强的for循环填充多维数组)-不起作用 static char[][] battleBoard = new char[10][10]; public static void main(String[] args) { for(char[] rows:battleBoard) { for(char column:rows) { column

我希望你们都做得很好,所以我想问题在于理解这两种代码之间的区别:

第一个代码(使用增强的for循环填充多维数组)-不起作用

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


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


}
如果我们试图使用以下代码打印出数组(期望将“*”分配给数组中的每个元素),我们将失败(即它仍然是空的)

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


谢谢你帮我的忙

第一个方法不填充数组,因为在代码中

for (char column : rows) {
    column = '*';
}
数组中的值被复制到新变量
。然后,只需为该变量指定一个新值,但数组中的元素保持不变

方法
Arrays.fill()
不复制值,而是直接在数组上操作。您可以自己使用这段代码(基本上与
Arrays.fill()
does相同):

for(int i=0;i
我要感谢SilverNak的回答。以下是我对答案的最终看法(详细)-对于正在搜索的用户:

列和行之间的区别在于,“列”是表示多维数组(例如:battleBoard)中单元的单个基本变量,但当涉及到“行”时,它是对象(一维数组(例如:battleBoard[i])的参考变量,其中i属于区间[0,battleBoard.length),当涉及到不同的引用x,y,z,其中y=x,z=y,那么对其中一个(比如z)所做的任何更改(除了将其设置为null)都会影响所有其他引用,因为它们引用相同的对象。 我用以下两个代码块做了一个简单的类比:

首先是当我们使用原语变量时(如前面问题中的“列”)

结果将是打印
3 10

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

第二个是当我们使用引用变量时(就像我们前面问题中的“行”)

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


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

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

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

是一个变量,它显示当前元素的值,实际上不允许您对数组中的该元素进行写入操作。如果希望它正常工作,您应该反转循环,使用for each打印,使用double for循环写入数组。另外
Arrays.fill()
只是按照它所说的去做,这就是它工作的原因。

第一个示例不工作,因为它没有更新数组,只是更新了从数组中获得的值。第二个示例工作,因为您调用的代码已经正确实现,所以这一点也不奇怪。我不清楚您的问题是什么。谢谢您在这里伸出援手t如果你能容忍我说的“方法Arrays.fill()不复制值,而是直接在数组上操作。”这里“数组”指的是多维数组,我猜,但是为什么它不指一维数组行!!,换句话说,Arrays.fill()为什么不处理参数“rows”作为一个分离的-array-variable,在这种情况下(它只是一个副本)>>battleBoard的值不会改变,很抱歉没有说清楚。
Arrays.fill()
对您作为参数给出的数组进行操作。因此,在您的情况下,此函数的每次调用都会填充二维
battleBoard
中的一行。这里的区别是:
是对
battleBoard
列中一行的引用是arrayThx中一个单元格的副本,以供您的贡献我认为这是一个误解。我们关心的是(不是增强的for循环的功能),而仅仅是“作为两个不同引用的列和行之间的差异”,所以最后发现这些家伙是完全不同的!一个是基元,另一个是对对象的引用!。所以这不是for each循环(增强for loop)的错误,也不是array.fill()的错误,我认为为了更深入地理解,需要指出这一点!
for (char column : rows) {
    column = '*';
}
for (int i = 0; i < battleBoard.length; i++) {
    for (int j = 0; j < battleBoard[i].length; j++) {
        battleBoard[i][j] = '*';
    }
}
int x = 3;
int y = 4;

y = x;
y = 10;
System.out.print(x + " ");
System.out.println(y);
int[] test1 = new int[5];
int[] test2 = test1;
test2[2] = 3;
System.out.print(Arrays.toString(test1) + " ");
System.out.print(Arrays.toString(test2));
for(char column:rows){
    column = '*';
}