我现在正在程序中处理这段代码,问题似乎出在我停止第二维内循环的行上。
这是数组的示例输出
- 9 6 6
- 7 6 4
- 4 8 5
当我运行此代码时,输出为:
- 4 4 6
- 5 6 6
- 7 8 9
我的预期输出是:
- 4 4 5
- 6 6 6
- 7 8 9
数字:“6”位置不正确。这是因为当我尝试运行 for 循环上方有嵌套 for 循环的部分时,它只运行一次,因此它只检查第一列,而不是到达 6 所在的第三列。问题是我需要限制该循环仅读取从 row#0 column#0 到 row#2 column#0 的最高数字。
如何解决这个问题?我想过使用一维数组并将所有二维数组元素放入其中并对其进行排序,然后将其放回二维数组并再次打印,但这不会使我的代码解决对二维数组进行排序所需的过程。
public static void sortArray(){
int x = len-1, y = len-1;
int iKey=0,jKey=0;
int cnt=0;
do{
cnt++;
if(y==-1){
x--;
y=len-1;
}
System.out.println(cnt+".)"+x+"-"+y);
int hi = -1;
for(i = 0;i <= x; i++)
for(j = 0;j <= y; j++){
if(twodiArray[i][j]>hi){
hi = twodiArray[i][j];
iKey = i;
jKey = j;
}
}
int temp = twodiArray[iKey][jKey];
twodiArray[iKey][jKey] = twodiArray[x][y];
twodiArray[x][y] = temp;
//dispArray();
y--;
}while(cnt<9);
}
最佳答案
问题出在您搜索最大元素的循环中。假设您有数组 5x5、x=1
和 y=1
。然后循环将仅检查以下元素:[0][0]、[0][1]、[1][0]、[1][1]。但它还应该检查 [0][2]、[0][3]、[0][4]。
使用之前的代码,您只检查了以下单元格:
XX...
XX...
.....
.....
.....
但是您需要检查这些:
XXXXX
XX...
.....
.....
.....
所以你需要这样的东西:
for(i = 0;i <= x; i++) {
int upper; // How many elements we need to check on current row.
if (i != x) {
upper = len - 1; // We are not in last row, so check all elements.
} else {
upper = y; // On the last row we need to check only elements up to y.
}
for(j = 0;j <= upper; j++){
if(twodiArray[i][j]>hi){
hi = twodiArray[i][j];
iKey = i;
jKey = j;
}
}
}
我的代码完全检查每一行,直到最后一行。
编辑
如果您使用:
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
...
}
}
然后你只迭代左上角在(0,0)和右下角在(y,x)的recangle。例如。 x = 4,y = 3:
XXX...
XXX...
XXX...
XXX...
......
但你的目标是完全完成最后一行之前的每一行。因此,完整检查第 0、1 和 2 行以及第 3 行中的 3 个元素。我的代码做到了。 upper
显示我们需要检查除最后一行之外的所有行的行中有多少个值,它等于 len - 1
(检查整行)。最后一个是 y
。
关于java - 使用所有元素对二维数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218338/