问一个JAVA关于数组排序的问题。

int num1[][]={{1},{45,66},{23,67,11},{64,342,65,71}};
第一段: for(int m[]:num1){
for(int n:m){
Arrays.sort(m);
System.out.print(n);
}
System.out.println();

}
第二段 for(int i=0;i<num1.length;i++){
for(int j=0;j<num1[i].length;j++){
Arrays.sort(num1[i]);
System.out.print(num1[i][j]);
}
System.out.println();
}

这两端都是对二维数组排序,数组是一样的。为什么第一段的结果是:
1
4566
232367
646571342 (很明显这里出错了,因为第三行出现了两个23.原本是23,67,11)
第二段是
1
4566
112367
646571342
(很明显这段是正确的)

问题在于,我不知道第一段错在哪里。
谁帮我指正一下呢?不甚感激!
小弟是自学JAVA,问这么肤浅的问题让大家笑话了。

楼上,楼主主要问的是为什么这两个会不同。

给你第一段加个注释你看看吧。
第一段: for(int m[]:num1){
//这里相当与在第二段定义了 int m[] =num1[i]
for(int n:m){
//这里相当与在第二段定义了 int n =num1[i][j]
Arrays.sort(m);
System.out.print(n);
//这里的n已经被先定义了,还没排序的时候被定义所以是23.
//第二段不同是因为实时调用而不是先定义再调用,你在第二段先定义int n =num1[i][j]再输出就跟第一段一样了,自动定义是这两种循环的主要区别,明白了不 ?
}
System.out.println();

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-09
for(int n:m){
Arrays.sort(m);
System.out.print(n);
排序应该放到内循环的外面。。。先把数组排好序。。。再循环每一个数并输出。。。

修改之后代码如下:
int num1[][]={{1},{45,66},{23,67,11},{64,342,65,71}};
for(int m[]:num1){
Arrays.sort(m);
for(int n:m){

System.out.print(n);
}
System.out.println();

}

希望对你有帮助。。。。仍有问题可以HI我。。。。。追问

foreach到底是怎么运行的啊?
为什么用for双层循环又可以呢?

追答

foreach是每循环一次。。。取里面一个数。。。

其实你后面那个最好也把sort写在第二个循环外的。。

对于foreach来说。。。第一次循环的时候还没有排序。。。n就获取了第一个值。。。就是23

后面循环的时候就已经排好序了。。。。取第二值是排了序的。。。排好序的第二值就是23

所以就会得到结果232367了

不知道有没有说清楚。。。你明白了没有。。。

第2个回答  2011-03-10
for (int n : m)
在这一步的时候,n已经被m赋值(数组m中的第一个值),因此第一次输出的时候,n就是数组m中的第一个值!下面Arrays.sort(m);对数组m进行了排序,但是在第一次循环中并没有再次将排序后的第一个值赋给n
相似回答