1、基本介绍
2、应用实例
package array;
import java.io.*;
/*
二维数组 转 稀疏数组的思路:
1. 遍历二维数组,得到有效数据的个数 sum
2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
3. 将二维数组的有效数据数据存入到 稀疏数组
稀疏数组 转 二维数组的思路:
1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,
比如上面的 chessArr2 = int [11][11]
2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
*/
public class SparseArray {
public static void main(String[] args) throws IOException {
// 定义一个二维数组表示棋盘。1表示黑子,2表示蓝子
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
// 二维数组转稀疏数组
int[][] sparseArr = toSparse(chessArr);
printArray("二维数组转稀疏数组", sparseArr);
// 稀疏数组转二维数组
int[][] chessArr_2 = toNormal(sparseArr);
printArray("稀疏矩阵转二维矩阵", chessArr_2);
}
private static int[][] toSparse(int[][] chessArr) throws IOException {
int sum = printArray("原始的二维数组", chessArr);
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr.length;
sparseArr[0][2] = sum;
int count = 1;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0) {
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
count++;
}
}
}
saveSparse(sparseArr);
return sparseArr;
}
private static void saveSparse(int[][] sparseArr) throws IOException {
File file = new File("F:\\map.data");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
for (int i = 0; i < sparseArr.length; i++) {
writer.write(sparseArr[i][0] + "\t" + sparseArr[i][1] + "\t" + sparseArr[i][2] + "\t\n");
}
writer.close();
}
private static int[][] toNormal(int[][] sparseArr) throws IOException {
File file = new File("F:\\map.data");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), "utf-8");
BufferedReader br = new BufferedReader(reader);
String tempStr;
String[] tempArr;
StringBuffer tempBuffer = new StringBuffer();
while ((tempStr = br.readLine()) != null) {
tempBuffer.append(tempStr);
}
tempArr = tempBuffer.toString().split("\t");
int row = Integer.parseInt(tempArr[0]);
int column = Integer.parseInt(tempArr[1]);
int sum = Integer.parseInt(tempArr[2]);
int[][] chessArr_2 = new int[row][column];
for (int i = 3; i < tempArr.length; i+=3) { // 逐个将数组元素读取出来
int r = Integer.parseInt(tempArr[i]);
int c = Integer.parseInt(tempArr[i+1]);
int v = Integer.parseInt(tempArr[i+2]);
chessArr_2[r][c] = v;
}
return chessArr_2;
}
public static int printArray(String arrayName, int[][] array) {
int sum = 0;
System.out.println(arrayName + ":");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.print(array[i][j] + "\t");
if (array[i][j] != 0) {
sum++;
}
}
System.out.println();
}
System.out.println("------------------------------------------------\n");
return sum;
}
}