二维数组之稀疏数组
1 package com.Lucky.base; 2 3 import java.util.Arrays; 4 5 /** 6 * 稀疏数组:记录有效数据 7 */ 8 public class sparseArray { 9 public static void main(String[] args) { 10 ///案例:11*11的棋盘 数据保存方法 11 12 //1.普通的二维数组 13 int[][] arr1=new int[11][11]; 14 //将数据放进数组中 0代表空白 1代表白棋子 2代表黑棋子 15 //白棋数据 16 arr1[5][6]=1; 17 arr1[2][6]=1; 18 arr1[5][9]=1; 19 arr1[4][4]=1; 20 //黑棋数据 21 arr1[1][7]=2; 22 arr1[2][2]=2; 23 arr1[3][9]=2; 24 arr1[7][7]=2; 25 //效果图: 占据内存太大【要优化】 26 /* 27 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 2 0 0 0 29 0 0 2 0 0 0 1 0 0 0 0 30 0 0 0 0 0 0 0 0 0 2 0 31 0 0 0 0 1 0 0 0 0 0 0 32 0 0 0 0 0 0 1 0 0 1 0 33 0 0 0 0 0 0 0 0 0 0 0 34 0 0 0 0 0 0 0 2 0 0 0 35 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0 0 0 0 38 */ 39 //打印普通数组 40 System.out.println("==============打印普通数组=============="); 41 printArr(arr1); 42 System.out.println("==============打印稀释数组=============="); 43 printArrOut(sparseArr(arr1)); 44 System.out.println("==============转换稀释数组成普通数组=============="); 45 printArrOut(caseToArr(sparseArr(arr1))); 46 47 48 } 49 50 51 52 //2.将二维数组转换成稀疏数组 53 //效果图: 54 /* 55 行 列 有效值 56 11 11 8 57 [0] 1 7 2 58 [1] 2 2 2 59 [2] 3 9 2 60 [3] 7 7 2 61 [4] 2 6 1 62 [5] 4 4 1 63 [6] 5 6 1 64 [7] 5 9 1 65 66 */ 67 68 69 /** 70 * 思路:1.获取原来二位数组的行和列 71 * 2.获取有效值个数[黑白棋的总和] 72 * 3.创建新的二维数组 行的长度row=有效值+1 73 * 列的长度col=3 74 * 4.在第一行开始填充数据头部 75 * 5.在第二行开始填充数据 76 */ 77 78 public static int[][] sparseArr(int[][] args){ 79 // 1.获取原来二位数组的行和列 80 int row=args.length; 81 int col=args[0].length; 82 83 // 2.获取有效值个数[黑白棋的总和] 84 int sum=0; //黑白棋的总和 85 for (int i = 0; i < args.length; i++) { 86 for (int j = 0; j < args.length; j++) { 87 //进入二维数组内部 88 if(args[i][j]!=0){ 89 sum++; //如果是有效值,sum数量递增 90 } 91 } 92 } 93 94 //3.创建新的二维数组 行的长度row=有效值+1 95 // 列的长度col=3 96 int[][] newArr=new int[sum+1][3]; 97 98 // 4.在第一行开始填充数据头部 99 newArr[0][0]=row; 100 newArr[0][1]=col; 101 newArr[0][2]=sum; 102 103 // 5.在第二行开始填充数据 104 int index=1; //定义要填充数据的行数【第二行开始】 105 for (int i = 0; i < args.length; i++) { 106 for (int j = 0; j < args.length; j++) { 107 if(args[i][j]!=0){ 108 newArr[index][0]=i; 109 newArr[index][1]=j; 110 newArr[index][2]=args[i][j]; 111 112 index++; 113 } 114 } 115 } 116 return newArr; 117 } 118 119 /** 120 * 将稀疏数组转换成普通数组 121 * @param args 122 * @return 123 */ 124 public static int[][] caseToArr(int[][] args){ 125 // 1.获取原来稀疏数组的行和列 126 int[] frist=args[0]; //获取稀疏数组中的第一行【第一行存在原来数组的行数和列数以及有效个数】 127 128 int row=frist[0]; //稀疏数组中的[0][0]是原来数组的行数 129 int col=frist[1]; //稀疏数组中的[0][1]是原来数组的列数 130 131 //创建新数组 132 int[][] newVar=new int[row][col]; 133 for (int i = 1; i < args.length; i++) { //args.length=frist[2]+1 134 int[] sparseRow = args[i]; 135 /// sparseRow:稀疏数组的行的所有数据: 例如:[1,7,2] 136 //sparseRow[0]= 1 137 //sparseRow[1]= 7 138 //sparseRow[2]= 2 139 newVar[sparseRow[0]][sparseRow[1]] = sparseRow[2]; //在指定位置进行赋值操作 140 141 //也可以这样: 142 // newVar[args[i][0]][args[i][1]] = args[i][2]; 143 } 144 return newVar; 145 } 146 147 //将稀疏数组转换成二维数组 148 149 150 /** 151 * 打印二维数祖方法: 152 * @param sd 153 */ 154 public static void printArr(int[][] sd){ 155 156 for (int i = 0; i < sd.length; i++) { 157 for (int j = 0; j < sd.length; j++) { 158 System.out.print(sd[i][j]+"\t"); 159 160 } 161 System.out.println(); 162 163 } 164 } 165 166 167 /** 168 * 打印稀释数组方法 169 */ 170 public static void printArrOut(int[][] sd){ 171 172 for (int i = 0; i < sd.length; i++) { 173 for (int j = 0; j < sd[0].length; j++) { 174 System.out.print(sd[i][j]+"\t"); 175 176 } 177 System.out.println(); 178 179 } 180 } 181 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律