来自尚硅谷Java数据结构的课程笔记
- 当遇见一个数组中有许多默认的重复数字时候,如棋盘,地图,可以用稀疏数组存储,节省存储空间
- 掌握数组到稀疏数组
- 掌握稀疏数组返回原数组
案例

可以看到以稀疏数组存储有效的节省了空间,接下来我们来实现代码。
第0行表示六行七列,八个有效数字
代码
创建数组,初始化并输出
// 创建原始二维数组
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 初始化原始的二维数组
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println("");//控制换行
}
我们得到一个11*11的数组
小知识点
- printf可以格式化输出
- for( : )可以根据内容遍历
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
遍历二维数组中非0数据个数,据此创建一个 sum行,3列的数组。
// 遍历二维数组的到非0数据的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0){
sum++;
}
}
}
// 创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = 11;
遍历二维数组,非0的值存放到稀疏数组中,随后输出稀疏数组
// 遍历二维数组,非0的值存放到稀疏数组中
int count = 0; //用于记录是第几个非零数据
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; 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",sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
System.out.println("");
}
得到稀疏数组,第一行是原数组信息
得到的稀疏数组为
11 11 11
1 2 1
2 3 2
最后是恢复过程
System.out.println("*******************************");
// 稀疏数组恢复
int[][] chessArr2= new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1; i < sparseArr.length;i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 恢复后的二维数组
for (int[] row : chessArr2) {
for( int data : row){
System.out.printf("%d\t",data);
}
System.out.println("");
}
完整代码
public class SparseArray {
public static void main(String[] args) {
// 创建原始二维数组
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 初始化原始的二维数组
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println("");//控制换行
}
// 遍历二维数组的到非0数据的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0){
sum++;
}
}
}
// 创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = 11;
// 遍历二维数组,非0的值存放到稀疏数组中
int count = 0; //用于记录是第几个非零数据
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; 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",sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
System.out.println("");
}
System.out.println("*******************************");
// 稀疏数组恢复
int[][] chessArr2= new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1; i < sparseArr.length;i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 恢复后的二维数组
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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 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 11
1 2 1
2 3 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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

374

被折叠的 条评论
为什么被折叠?



