首先什么是稀疏数组呢?
当一个数据大部分为0或者大部分都为1时,可以用另外一个数组来保存它,节约空间。
先用图片表示
将二维数组转化为稀疏数组的思路:
1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
3.将二维数组的有效数据存入到稀疏数组中
稀疏数组转化为二维数组的思路:
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;
2.再读取稀疏数组的数据,并且赋值给数据就可以了。
public class SparseArray {
public static void main(String[] args){
//创建一个原始的11*11的数组
//0表示没有棋子,1表示黑子,2表示白子
int chessArray[][] = new int[11][11];
chessArray[1][2] = 1;
chessArray[2][3] = 2;
chessArray[8][5] = 2;
//先打印原始的数组
for (int[] row : chessArray){
for (int data : row){
System.out.printf("%d\t",data);//格式化输出
}
System.out.printf("\n");
}
//将其转化为稀疏数组
int sum = 0;
for (int[] row : chessArray){
for (int data : row){
if (data != 0){
sum++;
}
}
}
//输出有效个数
System.out.printf("有效个数:"+sum);
//初始化稀疏数组
int sparsearray[] [] = new int[sum+1][3];
int sparserow = 1;
sparsearray[0][0] = 11;
sparsearray[0][1] = 11;
sparsearray[0][2] = sum;
for (int i = 0; i<chessArray.length; i++){
for (int j = 0; j<chessArray[i].length; j++){
if (chessArray[i][j] != 0){
sparsearray[sparserow][0] = i;
sparsearray[sparserow][1] = j;
sparsearray[sparserow][2] = chessArray[i][j];
sparserow++;
}
}
}
//稀疏数组输出
System.out.printf("输出稀疏数组\n");
for (int[] row : sparsearray){
for (int data : row){
System.out.printf("%d\t",data);//格式化输出
}
System.out.printf("\n");
}
//将稀疏矩阵存入磁盘中
File file = new File("d:\\SparseArray.txt");
try {
FileWriter out = new FileWriter(file);
for (int i = 0 ; i<sparsearray[0].length ; i++){
for (int j = 0 ;j < sparsearray[i].length ; j++){
out.write(sparsearray[i][j]+"\t");
}
out.write("\r\n");
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
//将稀疏数组从文件中读出来
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String line;
int renderrow = 0;
//逐行读取,将每个数据放入到数组中,
while ((line = in.readLine()) != null){
String[] temp = line.split("\t");
for (int j =0 ; j<temp.length;j++){
sparsearray[renderrow][j] = Integer.parseInt(temp[j]);
}
renderrow++;
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//将稀疏数组转化为二位数组
int rowlength = sparsearray[0][0];
int leilength = sparsearray[0][1];
int erweiarray[][] = new int[rowlength][leilength];
for (int i = 1 ;i <= sparsearray[0][2] ; i++){
erweiarray[sparsearray[i][0]][sparsearray[i][1]] = sparsearray[i][2];
}
//输出二维数组
System.out.printf("输出二维数组\n");
for (int[] row : erweiarray){
for (int data : row){
System.out.printf("%d\t",data);//格式化输出
}
System.out.printf("\n");
}
}
}