1、数组:数组是最常用的数据结构,是一种顺序的线性结构。“数“指数据,如数值,字符等;”组“指组合,顾名思义数组就是一组相似的数据的一个组合。

1.1、数组的实现

package array;

public class Array {
    public static void main(String[] args) {
        //1.创建数组时,直接赋值,一次创建,后期不可更改大小
        int[] arr1 = {1,4,6,9,12};
        //2.创建数组时,先给定大小,后期再往里面加数据
        int[] arr2 = new int[5];
        arr2[0] = 14;
        arr2[1] = 3;
        arr2[2] = 6;
        arr2[3] = 23;
        arr2[4] = 2;
        //3.字符串型数组,直接赋值
        String[] str1 = {"obama","trump","bush","张三"};
        //4.字符串型数组,先给定大小,再根据数组下标赋值
        String[] str2 = new String[3];
        str2[0]= "Jack";
        str2[1] = "Ross";
        str2[2] = "Titanic";
        //5.遍历数组
        for(int i=0;i<arr1.length;i++) {
            System.out.printf("arr1[%d]=%d\t",i,arr1[i]); 
        }
        System.out.println();
        for(int i=0;i<str1.length;i++) {
            System.out.printf("str1[%d]=%s\t",i,str1[i]);
        }
        System.out.println();
        //5.根据数组下标取单个数组中的数据
        System.out.println("arr2[1]="+arr2[1]);
        System.out.println("str2[1]="+str2[0]);
    }
}
输出结果:

arr1[0]=1    arr1[1]=4    arr1[2]=6    arr1[3]=9    arr1[4]=12    
str1[0]=obama    str1[1]=trump    str1[2]=bush    str1[3]=张三    
arr2[1]=3
str2[1]=Jack

 1.2、二维数组:一维数组的索引下标是一个数,一个下标索引对应一个值,二维数组是在一维数组上扩展开来,即用两个数来确认一个索引下标。

  比如如下图的棋盘可用二维数组表示:

 

 

 

public class TwoArray {
    public static void main(String[] args) {
        //创建二维数组
        int[][] arr = new int[11][11];
        //数组默认值为0;1表示黑子,2表示蓝子
        arr[1][2] = 1;
        arr[2][3] = 2;
        //打印二维数组;
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr.length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

打印输出二维数组:

0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 

   1.3、二维数组转成稀疏数组

 

 

 

 

 

   1.3.1、应用实例,使用稀疏数组,来保存类似于前面的棋盘或地图:

 

 

 代码实现:

package com.array;

public class SparseArray {
    public static void main(String[] args) {
        //创建原始的二维数组表示棋盘
        int chessArr1[][] = new int[11][11];
        //0表示没有子,1表示黑子,2表示蓝子
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[4][5] = 2;
        //输出原始二维数组:
        System.out.println("原始的二维数组:");
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        //将二维数组,转成 稀疏数组
        //1.先遍历二维数组,得到非0数据的个数
        int sum = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }

        //创建对应的稀疏数组
        int sparseArr[][] = new int[sum + 1][3];
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1.length;
        sparseArr[0][2] = sum;

        //遍历二维数组,将非0的值存到sparseArr中
        int count = 0;//count记录是第几个非0数据
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }

        //输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组~~~~~~");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        System.out.println();

        //将稀疏数组 -->回复成原始的二维shuz
        //1.先读取稀疏数组的第一行,并赋值给原始的二维数组
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.读取稀疏数组后几行的数据(从第二行开始),并赋值给原始的二维数组
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //输出恢复后的二维数组
        System.out.println();
        System.out.println("恢复后的二维数组");

        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}



结果打印输出:

原始的二维数组:
0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    2    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    

得到的稀疏数组~~~~~~
11    11    3    
1    2    1    
2    3    2    
4    5    2    


恢复后的二维数组
0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    2    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    

总结:稀疏数组可以认为是对原始二维数组的压缩,可节约内存空间!

 

posted on 2020-08-15 12:09  二十二画生的执著  阅读(133)  评论(0编辑  收藏  举报