注:这是看了尚硅谷,韩顺平老师《java数据结构和算法》视频后,做的笔记。
稀疏数组:是sum+1行,3列的
sum:原数组有效元素的个数(图中map 1 的个数)
稀疏数组第一行意思:原数组的行数,原数组的列数,有校值的个数
稀疏数组后面行意思:有效值所在的行数,有效值所在的列数,有效值
public class SparseArrayTest {
public static void main(String[] args) throws IOException {
// 定义一个10*10的地图(map)
int[][] map = new int[10][10];
map[1][2] = 1;
map[3][4] = 1;
map[6][9] = 1;
// 将该地图转为稀疏数组存储在map.data文件中
// 1.转化为稀疏数组
int sum = 0; // 用来记录map中有用记录的个数
for(int[] array1 : map){
for(int data1 : array1){
if(data1 != 0){
sum++;
}
}
}
// 1.1 造一个[sum+1][3]的稀疏数组
int[][] mapSparseArray = new int[sum+1][3];
// 1.2 稀疏数组第一行值为:map的行数,map的列数,map有效值的个数
mapSparseArray[0][0] = map.length;
mapSparseArray[0][1] = map.length;
mapSparseArray[0][2] = sum;
// 1.3 定义a,为了在遍历map时,将有效值存在mapSparseArray中
int a = 1;
// 1.4 遍历原数组,将有效的值存在mapSparseArray中
for(int i = 0; i < map.length; i++){
for(int j = 0; j < map[i].length; j++){
if(map[i][j] != 0){ // 循环找到有效值num
mapSparseArray[a][0] = i + 1; // a行,第一列为有效值num的所在行数
mapSparseArray[a][1] = j + 1; // a行,第二列为有效值num的所在的列数
mapSparseArray[a][2] = map[i][j]; // a行。第三列为有效值num。
a++;
}
}
}
// 2.将该稀疏数组存放到 d:\map.data中
FileWriter fw = new FileWriter("D:\\map.data");
for (int[] array : mapSparseArray){
for (int data : array ){
fw.write(data);
}
}
fw.close();
// 3. 从map.data中读取该稀疏数组
// 3.1 先造个稀疏数组
int[][] mapSparseArray2 = new int[sum+1][3];
// 3.2 将map.data中数据读入mapSparseArray2中
FileReader fr = new FileReader("D:\\map.data");
for (int i = 0; i < sum+1; i++){
for (int j = 0; j < 3; j++){
int num = fr.read();
mapSparseArray2[i][j] = num;
}
}
fr.close();
// 4. 将稀疏数组还原成原数组
int[][] map2 = new int[mapSparseArray2[0][0]][mapSparseArray2[0][1]];
for (int i = 1; i < mapSparseArray2.length; i++){
map2[mapSparseArray2[i][0] - 1][mapSparseArray2[i][1] - 1] = mapSparseArray2[i][2];
}
// 5.将还原后的map2输出
for (int[] array : map2){
for (int data : array ){
System.out.print(data + "\t");
}
System.out.println();
}
}
}
代码运行截图:
这里为了代码的简洁性。write,reade没加try-catch.直接throws IOException