1.稀疏数组:当一个数组大部分元素为同一元素或无意义值时可以使用。
(1) 稀疏数组的第一行第一列a[0][0]记录原数组行。
(2) 稀疏数组的第一行第二列a[0][1]记录原数组列。
(3) 稀疏数组的第一行第三列a[0][3]记录原数组有意义值个数。
(4) 稀疏数组的其他行记录原数组有意义值的坐标与值。
二维数组转稀疏数组:1.遍历,得到有意义数据个数sum。2.根据sum可以创建稀疏数组。3.将二维数组有意义数据存入稀疏数组。
稀疏数组转二维数组:1.读取第一行,创建原始二维数组。2.读取稀疏数组后面值赋给原始二维数组。
import java.io.*;
public class SpareArray {
public static void main(String[] args) {
//创建原始数组---11 * 11的棋盘
/*
0:表示没有棋子
1:表示黑子
2:表示白字
* */
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//打印棋盘
System.out.println("=============原数组=============");
for (int[] row:chessArr) {
for (int date:row) {
System.out.printf("%d\t",date);
}
System.out.println();
}
//创建稀疏数组,赋值
int sparseArray[][] = new int[sum(chessArr)+1][3];
//记录原数组行
sparseArray[0][0] = chessArr.length;
//记录原数组列
sparseArray[0][1] = chessArr.length;
//有意义值的个数
sparseArray[0][2] = sum(chessArr);
//记录有意义数据
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++;
//有意义数据的行
sparseArray[count][0] = i;
//有意义数据的列
sparseArray[count][1] = j;
//有意义数据的值
sparseArray[count][2] = chessArr[i][j];
}
}
}
//打印稀疏数组
System.out.println("=============稀疏数组=============");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
//依据稀疏数组创建原数组,稀疏数组的第一行第一列记录原数组的行,第一行第二列记录原数组的列。
int OriginChessArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
OriginChessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("=============稀疏数组还原=============");
for (int[] row:OriginChessArray) {
for (int date:row) {
System.out.printf("%d\t",date);
}
System.out.println();
}
public static int sum(int chessArr[][]){
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++;
}
}
}
return sum;
}
}