题目:(来源于how2J 教程)
首先定义一个5X8的二维数组,然后使用随机数填充满。
先把二维数组使用System.arraycopy进行数组复制到一个一维数组
然后使用sort进行排序
最后再复制回到二维数组。
我的代码:
import java.util.Arrays;
public class Hero{
public static void main(String[] args) {
int [][] s=new int [5][8];
int []a=new int[40];
for(int i=0;i<5;i++)
{
for(int k=0;k<8;k++)
{
s[i][k]=(int)(Math.random()*100);
System.out.print(s[i][k]+" ");
}
System.out.println();
}
System.out.println("\n");
int n=0;
for(int i=0;i<5;i++)
{
for(int k=0;k<8;k++)
{
a[n]=s[i][k];
System.out.print(a[n]+" ");
n++;
}
}
System.out.println();
Arrays.sort(a);
System.out.println();
for(int l=0;l<a.length ;l++)
{
System.out.print(a[l]+" ");
}
n=0;
for(int i=0;i<5;i++)
{
for(int k=0;k<8;k++)
{
s[i][k]=a[n];
n++;
}
}
System.out.println("\n");
for(int i=0;i<5;i++)
{
for(int k=0;k<8;k++)
{
System.out.print(s[i][k]+" ");
}
System.out.println();
}
}
}
另一个Java 学习伙伴的代码(代码来源于how2J 教程):
int value[][] = new int[5][8];
int res[] = new int[40];
//填充二维和复制数组并输出二维数组
for(int i = 0; i < 5; i++){
for(int j = 0; j < 8; j++){
value[i][j] = (int)(Math.random()*100);
System.out.print(value[i][j] + " ");
}
System.out.println(" ");
System.arraycopy(value[i], 0, res, value[i].length * i, value[i].length);
}
//数组排序
Arrays.sort(res);
//输出一维数组
System.out.println("一维数组" + Arrays.toString(res));
//重填二维数组
for(int i = 0; i < 5; i++){
System.arraycopy(res, i * value[i].length, value[i], 0, value[i].length);
}
//输出二维数组
for(int i = 0; i < 5; i++){
for(int j = 0; j < 8; j++){
System.out.print(value[i][j] + " ");
}
System.out.println(" ");
}
这段代码选择了中间段 也就是核心的
我的思路和他一致 就是用System.arraycopy这个方法把二维数组复制到一维数组 之后同样的一维复制到二维 但是忽略了二维数组就是几个一维数组组成的 在码关于System.arraycopy进行复制的代码时候还是按照一般的情况 结果导致编译器报错 ——不能将二维复制到一维这种单个数字的复制
他的这种写法就可以避开这种问题也是用System.arraycopy
代码如下:
System.arraycopy(value[i], 0, res, value[i].length * i, value[i].length);
这里的value[i] 他是将二维数组中包含的一维数组整个挨个挨个直接复制到定义好的一维数组 就不是单个数字复制——
这种写法value[i] [k].
包括以下的重填:
for(int i = 0; i < 5; i++){
System.arraycopy(res, i * value[i].length, value[i], 0, value[i].length);