数据结构分为 线性结构 和 非线性结构
线性结构
数组 队列 链表 栈
非线性结构
二维数组[稀疏数组] 多维数组 广义表 图 树
稀疏数组
数组中大部分元素为同一个值的数组 压缩二维数组,小规模数组
处理方法: 1 记录 原数组的 行数 列数 不同值数
2 记录 不同值的 行号 列号 值
二维数组转稀疏数组 稀疏数组转二维数组
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class sparse_array {//大框架
public static void saveArray(int[][] sparseArr){
//1.创建字符输出流
FileWriter writeFile = null;
try {
//2.数据想写入的路径及文件
File file = new File("sparseArr.txt");
//3.如果该文件不存在,就创建
if(!file.exists()) {
file.createNewFile();
}
//4.给字节输出流赋予实例
writeFile = new FileWriter(file);
//5.通过循环将数组写入txt文件中
for(int i = 0; i < sparseArr.length; i++) {
//6.数据前n - 1列尾部加入","
for(int j = 0; j < sparseArr[0].length - 1; j++) {
writeFile.write(sparseArr[i][j] + ",");
}
//7.数组最后一列后面不加","
writeFile.write(sparseArr[i][sparseArr[0].length - 1] + "");
//8.加上换行符
writeFile.write("\n");
}
//9.把writeFile里的数据全部刷新一次,全部写入文件中
writeFile.flush();
} catch (Exception e) {//10.异常捕获
e.printStackTrace();
} finally {
try {
//11.如果writeFile不为空,就将其关闭
if(writeFile != null)
writeFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static int[][] readArray() {//返回值是int[][]类型
//1.声明一个字符输入流
FileReader reader = null;
//2.声明一个字符输入缓冲流
BufferedReader readerBuf = null;
//3.声明一个二维数组
int[][] array = null;
try {
//4.指定reader的读取路径
reader = new FileReader("sparseArr.txt");
//5.通过BufferedReader包装字符输入流
readerBuf = new BufferedReader(reader);
//6.创建一个集合,用来存放读取的文件的数据
List<String> strList = new ArrayList<>();
//7.用来存放一行的数据
String lineStr;
//8.逐行读取txt文件中的内容
while((lineStr = readerBuf.readLine()) != null) {
//9.把读取的行添加到list中
strList.add(lineStr);
}
//10.获取文件有多少行
int lineNum = strList.size();
//11.获取数组有多少列
String s = strList.get(0);
int columnNum = s.split("\\,").length;
//12.根据文件行数创建对应的数组
array = new int[strList.size()][columnNum];
//13.记录输出当前行
int count = 0;
//14.循环遍历集合,将集合中的数据放入数组中
for(String str : strList) {
//15.将读取的str按照","分割,用字符串数组来接收
String[] strs = str.split("\\,");
for(int i = 0; i < columnNum; i++) {
array[count][i] = Integer.valueOf(strs[i]);
}
//16.将行数 + 1
count++;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//17.关闭字符输入流
try {
if(reader != null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
//18.关闭字符输入缓冲流
try {
if(readerBuf != null)
readerBuf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//19.返回稀疏数组
return array;
}
public static void main(String[] args) {//主函数入口
//创建原始数组
int chessArr1[][] = new int[11][11];
chessArr1[3][6] = 1;
chessArr1[4][7] = 2;
chessArr1[5][8] = 3;
//输出数组
System.out.println("原始数组为:");
for(int[] row : chessArr1) {
for(int data : row) {
System.out.printf("%d\t",data);//printf
}
System.out.println();
}
//将二维数组转成稀疏数组
//先遍历数组 得到非零数据个数
int sum = 0;
for(int i = 0;i<11;i++){
for(int j = 0;j<11;j++){
if(chessArr1[i][j] != 0){
sum++;
}
}
}
System.out.println("sum="+sum);
//创建稀疏数组
int sparseArr[][] = new int[sum+1][3]; //加上第一行
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组 将非零值存到稀疏数组中
int num = 0;
for(int i = 0;i<11;i++){
for(int j = 0;j<11;j++){
if(chessArr1[i][j] != 0){
num++; //行数加一
sparseArr[num][0] = i;
sparseArr[num][1] = j;
sparseArr[num][2] = chessArr1[i][j];
}
}
}
/*
//输出稀疏数组
System.out.println("稀疏数组为:");
for(int i=0;i<sparseArr.length;i++){ //二维数组直接调用length 返回行数
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);//按行输出 三个元素
}
System.out.println();
*/
saveArray(sparseArr); //将稀疏数组存为文件
int sparseArr2[][] = readArray(); //读取文件中的稀疏数组
//将稀疏数组恢复成原始数组
//先读取稀疏数组第一行,创建新的二维数组
int chessArr2[][] = new int[sparseArr2[0][0]][sparseArr2[0][1]];
//读取稀疏数组第二行及之后的数据,赋给新的二维数组
for(int i = 1;i<sparseArr2.length;i++)
{
chessArr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];
}
//输出二维数组
System.out.println("恢复后二维数组为");
for(int[] row : chessArr1) {
for(int data : row) {
System.out.printf("%d\t",data);//printf
}
System.out.println();
}
}
}