1.稀疏数组
原数组—>稀疏数组:
稀疏数组就3列(除0行外):原数组的行,列,非0值
第0行:表示原数组有6行7列,8个非0的值。
剩余的行:记录原数组非0的值所在的行、列、值
2. 互相转换分析
3.原数组和稀疏数组相互转换
二维数组结构:
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组11*11
//0:表示没旗子,1表示黑子,2表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][4] = 2;
//输出原始的二维数组:
System.out.println("原始数组为:");
for(int[] row:chessArr1){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
/*
二维数组转稀疏数组的思路:
1. 遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组int[sum+1][3]
3.将二维数组的有效数据存入到稀疏数组中
*/
//1.先遍历二维数组,得到非0的数据个数
int sum=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j] != 0){
sum ++;
}
}
}
//2.创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的数据存放到稀疏数组中
int count = 0;//用于记录是第几个非0数据
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
//稀疏数组的第count行数据
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\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
System.out.println();
/*
稀疏数组转原始数组的思路:
1.先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组,chessArr2[11][11]
2.再读取稀疏数组的后几行数据,并赋给原始的二维数组
*/
//1.先读取稀疏数组的第一行
//稀疏数组的第一行的第一个数据和第二个数据分别为原始数组的行和列
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.再读取稀疏数组的后几行数据,并赋给原始的二维数组
for(int i=1;i<sparseArr.length;i++){
for(int j=0;j<sparseArr.length;j++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
//3.恢复后的二维数组为:
System.out.println("恢复后的二维数组为:");
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 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
得到稀疏数组为:
11 11 2
1 2 1
2 4 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 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
4. 课后习题
public class SparseArray1 {
public static void main(String[] args) throws IOException {
//创建一个原始的二维数组11*11
//0:表示没旗子,1表示黑子,2表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][4] = 2;
//输出原始的二维数组:
System.out.println("原始数组为:");
for(int[] row:chessArr1){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//1.先遍历二维数组,得到非0的数据个数
int sum=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j] != 0){
sum ++;
}
}
}
//2.创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的数据存放到稀疏数组中
int count = 0;//用于记录是第几个非0数据
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
//稀疏数组的第count行数据
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 = System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
for(int j=0;j<sparseArr[i].length;j++){
System.out.printf("%d\t",sparseArr[i][j]);
}
System.out.println();
}
//将稀疏数组写入到磁盘文件中
BufferedWriter bw = new BufferedWriter(new FileWriter("map.txt"));
bw.write("写入文件的稀疏数组为:");
bw.newLine();
for(int i=0;i<sparseArr.length;i++){
for(int j=0;j<sparseArr[i].length;j++){
bw.write(sparseArr[i][j]+"\t");
}
bw.newLine();
}
bw.close();
System.out.println();
/*
稀疏数组转原始数组的思路:
1.先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组,chessArr2[11][11]
2.再读取稀疏数组的后几行数据,并赋给原始的二维数组
*/
//1.先读取稀疏数组的第一行
//稀疏数组的第一行的第一个数据和第二个数据分别为原始数组的行和列
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.再读取稀疏数组的后几行数据,并赋给原始的二维数组
for(int i=1;i<sparseArr.length;i++){
for(int j=0;j<sparseArr.length;j++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
//3.恢复后的二维数组为:
System.out.println("恢复后的二维数组为:");
for(int[] row:chessArr2){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}