for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0) {
sparseRow++;
sparseArray[sparseRow][0] = i;
sparseArray[sparseRow][1] = j;
sparseArray[sparseRow][2] = arr[i][j];
}
}
}
return sparseArray;
}
【5】稀疏数组转二维数组
我们用稀疏数组保存数据,主要是为了节省磁盘空间,优化 IO 读写性能,但在最终复原棋盘的时候,我们还是需要将稀疏数组的数据转化为原普通二维数组数据,那么我们又将如何通过编码的方式去实现稀疏数组转二维数组呢?对应编码如下:
/**
-
稀疏数组转普通数组
-
@param sparseArr_稀疏数组
-
@return 普通二维数组
*/
public static int[][] castToArray(int[][] sparseArr) {
// 获取稀疏数组第 1 行(记录了原数组的总行数和总列数)
int[] rowFirst = sparseArr[0];
// 初始化数组(棋盘)
int row = rowFirst[0];
int column = rowFirst[1];
int[][] arr = new int[row][column];
// 初始化数据(黑白子)
for (int i = 1; i < sparseArr.length; i++) {
int[] sparseRow = sparseArr[i];
arr[sparseRow[0]][sparseRow[1]] = sparseRow[2];
}
return arr;
}
这样,我们就可以将稀疏数组还原为普通数组了。
【总结】
在存储数组数据的时候,我们如果存在许多默认值的数据,不妨用稀疏数组来进行存储,这样数据相对来说就会瘦小很多,不但可以节省磁盘空间,还可以优化磁盘读写时性能。
最后附上相关的整段代码:
/**
-
二维数组与稀疏数组
-
@author ZhangYuanqiang
-
@since 2021年5月13日
*/
public class SparseArrayTest {
public static void main(String[] args) {
// 用二维数组保存棋盘
int[][] arr = saveChess();
// 打印二维数组
print(arr);
// 将二维数组转化为稀疏数组
int[][] sparseArr = castSparseArray(arr);
// 打印稀疏数组
print(sparseArr);
// 稀疏数组转二位数组
int[][] arr2 = castToArray(sparseArr);
print(arr2);
}
/**
* 打印普通数组
*/
public static void print(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
System.out.println("--------------------------------------");
}
/**
* 将棋盘数据保存为二维数组
*/
public static int[][] saveChess() {
// 初始化棋盘(大小为 15 * 15)
int[][] arr = new int[15][15];
// 保存白子(用1表示)
arr[5][5] = 1;
arr[7][5] = 1;
arr[6][7] = 1;
// 保存黑子(用2表示)
arr[6][6] = 2;
arr[7][6] = 2;
arr[8][6] = 2;
arr[7][7] = 2;
return arr;
}
/**
* 普通数组转稀疏数组
*
* @param arr_普通数组
* @return 稀疏数组
*/
public static int[][] castSparseArray(int[][] arr) {
// 原数组的总行数
int row = arr.length;
// 原数组的总列数
int cloumn = arr[0].length;
// 获取黑白子总数
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
// 创建稀疏数组(sum+1 行表示 sum 个黑白子 + 1行规模)
int[][] sparseArray = new int[sum + 1][3];
// 第 1 行原二维数组的行、列、棋子总数
sparseArray[0][0] = row;
sparseArray[0][1] = cloumn;
sparseArray[0][2] = sum;
// 第 2 行开始存具体数据(每行都是一个棋子数据)
int sparseRow = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0) {
sparseRow++;
sparseArray[sparseRow][0] = i;
sparseArray[sparseRow][1] = j;
sparseArray[sparseRow][2] = arr[i][j];
}
}
}
return sparseArray;
}
/**
* 稀疏数组转普通数组
*
* @param sparseArr_稀疏数组
* @return 普通二维数组
*/
public static int[][] castToArray(int[][] sparseArr) {
// 获取稀疏数组第 1 行(记录了原数组的总行数和总列数)
int[] rowFirst = sparseArr[0];
// 初始化数组(棋盘)
int row = rowFirst[0];
int column = rowFirst[1];
int[][] arr = new int[row][column];
// 初始化数据(黑白子)
for (int i = 1; i < sparseArr.length; i++) {
int[] sparseRow = sparseArr[i];
arr[sparseRow[0]][sparseRow[1]] = sparseRow[2];
}
最后
既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?
就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。
如果觉得图片不够清晰,也可来找小编分享原件的xmind文档!
且除此份微服务体系大纲外,我也有整理与其每个专题核心知识点对应的最强学习笔记:
-
出神入化——SpringCloudAlibaba.pdf
-
SpringCloud微服务架构笔记(一).pdf
-
SpringCloud微服务架构笔记(二).pdf
-
SpringCloud微服务架构笔记(三).pdf
-
SpringCloud微服务架构笔记(四).pdf
-
Dubbo框架RPC实现原理.pdf
-
Dubbo最新全面深度解读.pdf
-
Spring Boot学习教程.pdf
-
SpringBoo核心宝典.pdf
-
第一本Docker书-完整版.pdf
-
使用SpringCloud和Docker实战微服务.pdf
-
K8S(kubernetes)学习指南.pdf
另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!
-
Dubbo框架RPC实现原理.pdf
-
Dubbo最新全面深度解读.pdf
-
Spring Boot学习教程.pdf
-
SpringBoo核心宝典.pdf
-
第一本Docker书-完整版.pdf
-
使用SpringCloud和Docker实战微服务.pdf
-
K8S(kubernetes)学习指南.pdf
[外链图片转存中…(img-RtVyTNKV-1719813802660)]
另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!
[外链图片转存中…(img-8WzOqam1-1719813802660)]