稀疏数组
Posted dabbie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏数组相关的知识,希望对你有一定的参考价值。
先看一个实际的需求
基本介绍
? 1.记录数组一共有几行几列,有几个不同的值
? 2.把具有不同值的元素的行列及值记录在一个小的规模的数组中,从而缩小程序的规模
稀疏数组的处理方法是:
1.记录数组一共有几行几列,有几个不同的值
2.把具有不同值的元素的行列及值记录在一个小的规模的数组中,从而缩小程序的规模
举例说明
? 我们可以清楚的看到,数组由原来的6x7,转化为稀疏数组后只有3x8了
应用实例
1.使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2.把稀疏数组存盘,并且可以从新恢复原来的二维数组数
3.整体思路分析
- 二维数组换稀疏数组的思路
1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
3.将二维数组的有效数据存入到稀疏数组。 - 稀疏数组转原始数组的思路
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
2.在读取稀疏数组后几行的数据,并赋给 原始的二维数组即可
代码实现
1.将稀疏数组保存在磁盘上,比如map.data
2.恢复原来的数组时,读取map.data进行恢复。
//创建原始数组
int chessArr[][] = new int[11][11];
/*模拟存储棋盘数据
* 落子位置:
* 1:黑子
* 2:白字
* 0:没有棋子
* */
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//展示原始数组
System.out.println("原始数组:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d ",data);
}
System.out.println();
}
//统计原始数组的有效数据个数
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int sparseArr[][] = new int[sum+1][3];
//初始化稀疏数组
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//将稀疏数组转化为二维数组
int count = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[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("==================================");
//将二维数组写入文件map.data
File file = new File("D:\\map.data");
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
System.out.println("保存中。。。");
for (int i = 0; i < sparseArr.length; i++) {
String data = sparseArr[i][0] + " " + sparseArr[i][1] + " " + sparseArr[i][2] + "
";
bw.write(data);
}
bw.close();
//从硬盘中读取稀疏数组数据
BufferedReader br = new BufferedReader(new FileReader(file));
//新建一个数组用来存储读取到的数据
List<String> list = new ArrayList<>();
//新建一个字符串来保存读取的每一行
String line = "";
while((line = br.readLine())!=null){
list.add(line);
}
br.close();
//新建一个稀疏数组
int newSparseArr[][] = new int[list.size()][3];
for (int i = 0; i < list.size(); i++) {
//获取原稀疏数组的每一行
String[] row = list.get(i).split(" ");
//将原稀疏数组的数据赋值给新稀疏数组
for (int j = 0; j < row.length; j++) {
newSparseArr[i][j] = Integer.parseInt(row[j]);
}
}
//输出新的稀疏数组:
System.out.println("读取的稀疏数组:");
for (int i = 0; i < newSparseArr.length; i++) {
System.out.printf("%d %d %d
", newSparseArr[i][0], newSparseArr[i][1], newSparseArr[i][2]);
}
System.out.println("================================");
//用新的稀疏数组还原二维数组
int chessArr2[][] = new int[newSparseArr[0][0]][newSparseArr[0][1]];
for (int i = 1; i < newSparseArr.length; i++) {
chessArr2[newSparseArr[i][0]][newSparseArr[i][1]] = newSparseArr[i][2];
}
//输出二维数组
System.out.println("还原的二维数组:");
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d ",data);
}
System.out.println();
}
以上是关于稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章