当前位置 博文首页 > 数组_队列_链表(Java)_Inmaturity_7的博客:数据结构和算法学习
(学自尚硅谷数据结构和算法前30节(java版))
当一个数组种大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据->转换成稀疏数组
二维数组转成稀疏数组的思路:
稀疏数组转成二维数组的思路:
package com.lxf.sparsearray;
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组11*11,假设有两个棋子:黑子在第二行第三列,蓝子在第三行第四列。
//0:表示没有棋子,1表示黑子 ,2表篮子
int charArr1[][] = new int[11][11];
charArr1[1][2]=1;
charArr1[2][3]=2;
charArr1[1][3]=1;
charArr1[1][4]=2;
charArr1[3][2]=1;
charArr1[2][2]=2;
//row column 长度
int rowL=charArr1.length;
int columnL=charArr1[0].length;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] row : charArr1) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//原始二维数组转成稀疏数组
//1.
// 得到非0数据的个数
//记录数组中非零数的个数
int sum=0;
for (int[] row : charArr1) {
for (int data : row) {
if(data!=0){
sum++;
}
}
}
//2.创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//3.将二维数组的数赋值给稀疏数组
sparseArr[0][0]=rowL;
sparseArr[0][1]=columnL;
sparseArr[0][2]=2;
//记录稀疏数组行
int count=0;
for (int i = 0; i < rowL; i++) {
for (int j = 0; j < columnL; j++) {
if(charArr1[i][j]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=charArr1[i][j];
}
}
}
//4.打印稀疏数组
System.out.println("得到的稀疏数组为:");
for (int[] row : sparseArr) {
System.out.printf("%d\t%d\t%d\t",row[0],row[1],row[2]);
System.out.println();
}
//5.将稀疏数组恢复成二维数组
int[][] charArr2=new int[sum+1][3];
for (int i = 1; i < sparseArr.length; i++) {
charArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
//输出恢复后的二维数组
System.out.println("恢复后的二维数组:");
for (int[] row : charArr2) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
结果:
稀疏数组存入文件,从文件取出操作代码:
package com.lxf.sparsearray;
import java.io.*;
import java.util.Arrays;
public class SparseArray {
public static void main(String[] args) throws IOException {
//创建一个原始的二维数组11*11,假设有两个棋子:黑子在第二行第三列,蓝子在第三行第四列。
//0:表示没有棋子,1表示黑子 ,2表篮子
int charArr1[][] = new int[11][11];
charArr1[1][2]=1;
charArr1[2][3]=2;
charArr1[1][3]=1;
charArr1[1][4]=2;
charArr1[3][2]=1;
charArr1[2][2]=2;
//row column 长度
int rowL=charArr1.length;
int columnL=charArr1[0].length;
//原始二维数组转成稀疏数组
//1.
// 得到非0数据的个数
//记录数组中非零数的个数
int sum=0;
for (int[] row : charArr1) {
for (int data : row) {
if(data!=0){
sum++;
}
}
}
//2.创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//3.将二维数组的数赋值给稀疏数组
sparseArr[0][0]=rowL;
sparseArr[0][1]=columnL;
sparseArr[0][2]=2;
//记录稀疏数组行
int count=0;
for (int i = 0; i < rowL; i++) {
for (int j = 0; j < columnL; j++) {
if(charArr1[i][j]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=