分析问题 因为二维数组的很多默认值是0,因此记录了很多没有意义的数据
解决: 稀疏数组(记录有效的坐标)
稀疏数组介绍
1 使用条件:
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组
2 处理方式
-
- 记录数组一共又几行几列,有多少个不同的值
- 把具有不同值的元素 的 行、列、及值记录在一个小规模的数组中,从而缩小程序的规模
- 如下图
代码
记录棋盘
1 普通二维数组
int[][] arr1 = new int[11][11];
arr1[1][2]=1;
arr1[2][3]=2;
System.out.println("原始数组");
for (int[] outside : arr1) {
for (int inside : outside) {
// /t 是空格
System.out.print(inside+"\t");
}
System.out.println();
}
2 稀疏数组
//将原始数组转换为稀疏数组
System.out.println("稀疏数组");
int sum = 0;
//读取原始数组
for (int i = 0; i <arr1.length ; i++) {
for (int j = 0; j <arr1[i].length ; j++) {
if(arr1[i][j]!=0){
sum++;
}
}
}
int[][] arr2 = new int[sum+1][4];
//稀疏数组的头部信息 几行几列几个有效数字
arr2[0][0]=11;
arr2[0][5]=11;
arr2[0][6]=sum;
int count = 0;
for (int i = 0; i <arr1.length ; i++) {
for (int j = 0; j <arr1[i].length ; j++) {
if(arr1[i][j]!=0){
count++;
arr2[count][0]=i;
arr2[count][7]=j;
arr2[count][8]=arr1[i][j];
}
}
}
for (int i = 0; i <arr2.length ; i++) {
System.out.println(arr2[i][0]+"\t"
+arr2[i][9] +"\t"
+arr2[i][10]);
}
3 还原数组
System.out.println("还原稀疏数组"); //读取稀疏数组的值 int[][] arr3 = new int[arr2[0][0]][arr2[0][11]]; //给其中的元素还原值 //i从1开始,因为0行是稀疏数组的头部信息,不需要读取 for (int i = 1; i <arr2.length ; i++) { for (int j = 0; j <arr2[i].length ; j++) { arr3[arr2[i][0]][arr2[i][12]] = arr2[i][13]; } } for (int[] outside : arr1) { for (int inside : outside) { // /t 是空格 System.out.print(inside+"\t"); } System.out.println(); }
标签:数组,int,System,稀疏,arr1,out From: https://www.cnblogs.com/Sco-/p/16990055.html