// 稀疏数组代码实现
// 一、创建原始二维数组
int[][] begin = new int[11][11];
// 向原始数组中添加元素
begin[2][3] = 16;
begin[3][4] = 18;
begin[6][6] = 168;
// 遍历原始数组
// 统计有效元素个数
int sum = 0;
System.out.println("原始数组为:");
for (int[] ints : begin){
for (int ele : ints){
System.out.print(ele + " ");
if (ele != 0) sum++;
}
System.out.println();
}
// 二、将原始数组转换为稀疏数组
// 创建稀疏数组
int[][] sparseArray = new int[sum+1][3];
// 为稀疏数组第一行添加数据
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
// 为稀疏数组添加数据(从第二行开始)
// count代表稀疏数组行号
int count = 1;
// 遍历原始数组,将有效元素的行数、列数、值添加进稀疏数组中
// i代表原始数组行号,k代表原始数组列号
for (int i = 0; i < 11; i++){
for (int k = 0; k < 11; k++){
if (begin[i][k] != 0){
sparseArray[count][0] = i;
sparseArray[count][1] = k;
sparseArray[count][2] = begin[i][k];
count++;
}
}
}
// 遍历稀疏数组
System.out.println("稀疏数组为:");
for (int i = 0; i < sparseArray.length; i++){
System.out.println(sparseArray[i][0] + " " + sparseArray[i][1] + " " + sparseArray[i][2]);
}
// 三、将稀疏数组保存进硬盘
System.out.println("将稀疏数组保存到硬盘");
// 创建一个输出流
FileWriter writer = null;
try {
writer = new FileWriter("F:\\数据结构和算法\\IDEA代码\\稀疏数组\\map.data");
// 将稀疏数组写进IO流中,一边遍历一遍写
for (int i = 0; i < sparseArray.length; i++){
writer.write(sparseArray[i][0] + " " + sparseArray[i][1] + " " + sparseArray[i][2] + " ");
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("保存成功");
// 四、从硬盘中读取稀疏数组
System.out.println("从硬盘中读取稀疏数组");
// 创建一个输入流
FileReader reader = null;
// 定义一个字符串缓冲对象用来接收读取到的字符
StringBuffer sb = null;
try {
reader = new FileReader("F:\\数据结构和算法\\IDEA代码\\稀疏数组\\map.data");
sb = new StringBuffer();
// 通过Reader类的read()方法读取单个字符,并将其转换成char类型
while(reader.ready()){
sb.append((char) reader.read());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("读取成功");
// 将读取到的字符转换成字符串
String s = sb.toString();
System.out.println(s);
// 将字符串切割成String数组
String[] strings = s.split(" ");
// 转换为稀疏数组
int[][] sparseArray2 = new int[strings.length/3][3];
// 为恢复后稀疏数组的第一行赋值
// 将String转换成int,使用Integer.parseInt()方法
sparseArray2[0][0] = Integer.parseInt(strings[0]);
sparseArray2[0][1] = Integer.parseInt(strings[1]);
sparseArray2[0][2] = Integer.parseInt(strings[2]);
// 为恢复后稀疏数组其它行赋值(从第二行开始)
int line = 1;
// 此处i为strings数组中元素下标
for (int i = 3; i < strings.length; i+=3){
sparseArray2[line][0] = Integer.parseInt(strings[i]);
sparseArray2[line][1] = Integer.parseInt(strings[i + 1]);
sparseArray2[line][2] = Integer.parseInt(strings[i + 2]);
line++;
}
System.out.println("还原后的稀疏数组为:");
for (int i = 0; i < sparseArray2.length; i++){
System.out.println(sparseArray2[i][0] + " " + sparseArray2[i][1] + " " + sparseArray2[i][2]);
}
// 五、稀疏数组还原为原始数组
int[][] overArray = new int[sparseArray2[0][0]][sparseArray2[0][1]];
for (int i = 1; i < sparseArray2.length; i++){
overArray[sparseArray2[i][0]][sparseArray[i][1]] = sparseArray2[i][2];
}
System.out.println("还原后的原始数组为:");
for (int[] ints : overArray){
for (int ele : ints){
System.out.print(ele + " ");
}
System.out.println();
}
}
}