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 ",i,arr1[i]); } System.out.println(); for(int i=0;i<str1.length;i++) { System.out.printf("str1[%d]=%s ",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 ", 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 %d %d ", 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 ", 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
总结:稀疏数组可以认为是对原始二维数组的压缩,可节约内存空间!