多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组;
二维数组的定义:
int a[][] = new int[2][5];//可以看作一个两行五列的数组
打印一个二维数组
public static void main(String[] args) {
int [][] array = {{1,2},{2,3},{3,4,6},{4,5}};//四行两列的数组
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
}
Arrays类
打印数组元素:
System.out.println(Arrays.toString(int a[]));
对数组进行排序
Arrays.sort(int a[]);
填充数组
Arrays.fill(int a[],val:value);//将数组a中的每一个元素填充为value;
冒泡排序
比较数组中相邻的两个元素,如果第一个比第二个大,就交换他们的位置;
每一次比较都会产生出一个最大或者最小的数字,下一轮则可以减少一次排序依次循环,直到结束;
实例:
public class Demo08 {
public static void main(String[] args) {
int a[] = {21,456,63,77,52,1,3,6};
sort(a);
System.out.println(Arrays.toString(a));
}
public static int[] sort(int[] arrays){
//外层循环:判断要走多少次
for (int i = 0; i < arrays.length-1; i++) {
//内层循环,如果第一个数比第二个数大,则交换位置
int a = 0;
for (int j = 0; j < arrays.length-1-i; j++) {
if (arrays[j] > arrays[j+1]){
a = arrays[j+1];
arrays[j+1] = arrays[j];
arrays[j] = a;
}
}
}
return arrays;
}
}
稀疏数组
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组;
稀疏数组的处理方式是:
记录数组中一共有几行几列,有多少个不同值;
把具有不同值的元素和行列及其值记录在一个小规模的数组中,从而缩小程序的规模;
如下图所示,上面是原始数组,下面是稀疏数组
0 | 0 | 0 | 22 |
0 | 11 | 0 | 0 |
0 | 0 | 0 | -6 |
0 | 0 | 0 | 0 |
行 | 列 | 值 | 注释 | |
[0] | 4 | 4 | 3 | 数组有四行四列,包含三个特殊值 |
[1] | 0 | 3 | 22 | 0行3列有特殊值为22 |
[2] | 1 | 1 | 11 | 1行1列有特殊值为11 |
[3] | 2 | 3 | -6 | 2行3列有特殊值为-6 |
应用:使用稀疏数组记录一个棋盘的落子情况
- 创建原始数组,利用数组记录落子情况:
//1.创建一个11*11的二维数组,0代表没有棋子,1为白棋,2为黑棋
int[][] Arrays = new int[11][11];
Arrays[1][2] = 2;
Arrays[2][3] = 1;
//2.输出原始的数组
System.out.println("输出原始的数组");
for (int[] array : Arrays) {//增强for循环
for (int i : array) {
System.out.print(i+"\t");
}
System.out.println();
}
- 将原始数组转换为稀疏数组:
//1.获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (Arrays[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数为:"+sum);
//2.创建一个稀疏数组
int[][] Arrays2 = new int[sum+1][3];//sum为有效值个数,+1是指稀疏数组的头行
Arrays2[0][0] = 11;
Arrays2[0][1] = 11;
Arrays2[0][2] = sum;
//3.遍历二维数组,将非零值存放到稀疏数组中
int count = 0;
for (int i = 0; i < Arrays.length; i++) {
for (int j = 0; j < Arrays[i].length; j++) {
if (Arrays[i][j] != 0){
count++;
Arrays2[count][0] = i;
Arrays2[count][1] = j;
Arrays2[count][2] = Arrays[i][j];
}
}
}
//输出稀疏数组
for (int[] ints : Arrays2) {//增强for循环
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
- 将稀疏数组还原:
//1.读取稀疏数组,创建新的将要还原的数组
int[][] Arrays3 = new int[Arrays2[0][0]][Arrays2[0][1]];
//新的数组的行列分别为稀疏数组的0行0列值和0行1列值
//2.还原特殊值
for (int i = 1; i < Arrays2.length; i++) {
Arrays3[Arrays2[i][0]][Arrays2[i][1]] = Arrays2[i][2];
}//只需要遍历行即可
//3.打印还原数组
for (int[] ints : Arrays3) {//增强for循环
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}