我正在尝试在2d char数组中切换两个元素,但它无法正常工作。我已经读过其他类似的问题,临时变量应该是1d数组,但我不相信这是真的。任何人都可以帮助我理解为什么这不起作用?
public static void moveTo(char[][] tissue, int i, int j){
char temp = tissue[i][j];
for(int k = 0; k < tissue.length; k++){
for(int l=0; l<tissue.length; l++){
if(tissue[k][l] == ' '){
tissue[k][l] = tissue[i][j];
tissue[k][l] = temp;
return;
}
}
}
}
答案 0 :(得分:3)
在第二个循环中,您必须使用tissue[k].length
。
并且tissue[i][j]
必须受到空白字符的影响(如果我理解的话)。 temp
没用。
public static void moveTo(char[][] tissue, int i, int j){
for(int k = 0; k < tissue.length; k++){
for(int l=0; l<tissue[k].length; l++){
if(tissue[k][l] == ' '){
tissue[k][l] = tissue[i][j];
tissue[i][j] = ' ';
return;
}
}
}
}
答案 1 :(得分:0)
我认为你正在寻找这个。
public static void moveTo(char[][] tissue, int i, int j){
for(int k = 0; k < tissue.length; k++){
for(int l=0; l<tissue.length; l++){
if(tissue[k][l] == ' '){
char temp = tissue[i][j];
tissue[i][j] = tissue[k][l];
tissue[k][l] = temp;
return;
}
}
}
}
这将在第一次出现' '
时搜索2D数组,并将其内容与位置i,j
处的元素交换。
您正在存储temp
,因为您很快会覆盖tissue[i][j]
中的值,但之后需要将其存储在tissue[k][l]
中。在这种情况下,您确实不需要temp
,因为您知道tissue[k][l]
始终是' '
。因此,您可以先覆盖它,而不需要存储它,就像在另一个答案中一样。
答案 2 :(得分:0)
这个答案主要基于问题的标题。如果您提供更多信息,我们可能会提供更多帮助。
代码中存在一些小问题导致它无法正常工作。
首先,无论何时循环遍历多维数组,您都需要确保内部循环使用正确的限制。 tissue.length
指的是外部数组的长度,但不能保证2d数组中的每个内部数组(即。tissue[0].length
)返回数组的长度,tissue[1].length
可能返回不同的数组值)。所以我们首先用tissue[k].length
替换内循环限制器。
for(int k = 0; k < tissue.length ; k++){
for(int l = 0 ; l < tissue[k].length ; l++){
if(tissue[k][l] == ' '){
tissue[k][l] = tissue[i][j];
tissue[k][l] = temp;
return;
}
}
}
我看到的下一个问题是交换。您拥有的代码实际上是在任何数组中查找第一个空格,并在i,j
处插入值,但您不会将任何内容放入索引i,j
。 Elliot提到的是if语句中的两行都将tissue[k][l]
替换为相同的值,即存储在tissue[i][j]
的值。相反,我们会将第一行更改为tissue[i][j] = tissue[k][l]
以执行交换。所以我们最终得到了follow方法,它将它找到的第一个字符串中的第一个空格字符与i,j
处的字符交换。
public static void moveTo(char[][] tissue, int i, int j){
char temp = tissue[i][j];
for(int k = 0; k < tissue.length ; k++){
for(int l = 0 ; l < tissue[k].length ; l++){
if(tissue[k][l] == ' '){
tissue[i][j] = tissue[k][l];
tissue[k][l] = temp;
return;
}
}
}
}