数据结构分为线性、非线性。
线性:数组、队列、链表、栈
非线性:树结构、图结构、多维数组、广义表
稀疏数组应用场景:在二维数组中,存在大量0、空,或者相同值时,可以使用稀疏数组存放。
列子:五子棋棋盘,棋子的位置。
稀疏数组:第一行记录棋盘的行、列大小及值的数量,后面的行记录值的位置。
此时棋盘对应的稀疏数组应该为
orderNum | row | col | val |
---|---|---|---|
1 | 11 | 11 | 2 |
2 | 1 | 2 | 1 |
3 | 2 | 3 | 2 |
练习的代码
public class SparseArr {
public static void main(String[] args) {
int[][] sparseArr = new int[11][11];
sparseArr[1][2] = 1;
sparseArr[2][3] = 2;
/**
* 常规
*/
System.out.println("---------------------------常规");
for(int[] s : sparseArr){
for (int s1 : s){
System.out.printf("%d\t",s1);
}
System.out.println();
}
/**
* 稀疏数组
*/
System.out.println("---------------------------对应的稀疏数组");
int count = 0;
for(int[] s : sparseArr){
for (int s1 : s){
if(s1 != 0){
count++;
}
}
}
int[][] sparseArr2 = new int[count+1][3];
sparseArr2[0][0] = 11;
sparseArr2[0][1] = 11;
sparseArr2[0][2] = count;
int count2 = 0;
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
if (sparseArr[i][j] != 0){
count2++;
sparseArr2[count2][0] = i;
sparseArr2[count2][1] = j;
sparseArr2[count2][2] = sparseArr[i][j];
}
}
}
for(int[] s : sparseArr2){
for(int s2 : s){
System.out.printf("%d\t",s2);
}
System.out.println();
}
/**
* 存文件
*/
String path = "C:\\Users\\Public\\Desktop\\1.txt";
File f = new File(path);
BufferedWriter bw = null;
if(!f.exists()){
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
bw = new BufferedWriter(new FileWriter(f));
for(int[] s : sparseArr2){
for(int s2 : s){
bw.write(String.format("%d,",s2));
}
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读文件
*/
BufferedReader br = null;
File ff = new File(path);
int[][] ii = new int[2][2];
if(ff.exists()){
try {
br = new BufferedReader(new FileReader(ff));
int row = 0;
while(br.ready()){
String str = br.readLine();
str = str.substring(0,str.length()-1);
String[] s = str.split(",");
int s1 = Integer.valueOf(s[0]);
int s2 = Integer.valueOf(s[1]);
int s3 = Integer.valueOf(s[2]);
if(row == 0){
ii = new int[s1][s2];
}else{
ii[s1][s2] = s3;
}
row++;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 读取文件之后的数组
*/
System.out.println("---------------------------读取文件后的");
for(int[] i : ii){
for (int i2 : i){
System.out.printf("%d\t",i2);
}
System.out.println();
}
}
}