实现二维数组与稀疏数组的相互转化,并附带实现了将数存入一个文件以及从文件中读取。
package sparseArray;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* 稀疏数组的学习
* @author 梁
*
*/
public class TsetsparseArray {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//一个16*16棋盘 使用二维数组存储 转换为一个稀疏数组 1、2分别代表黑白棋子
int[][] chessArr = new int[16][16];
chessArr[1][2] = 1 ;
chessArr[2][3] = 2 ;
chessArr[4][5] = 2 ;
int[][] parseArr = getParseArr(chessArr);
OutputParseArray(parseArr);
int[][] backArr = backArr(parseArr);
int[][] newA = InputParseArr();
printTwoArr(newA);
}
//将二维数组转化为稀疏数组
public static int[][] getParseArr(int[][] chessArr) {
//1.统计有几个非零数字
int sum = 0;
for(int i = 0;i<16;i++) {
for(int j = 0 ; j<16; j++) {
if( chessArr[i][j]!=0 ) {
sum++;
}
}
}
//2.创建稀疏数组并将非零元素存入
int[][] parseArr = new int[sum+1][3];
int row = 0;
parseArr[row] = new int[] {16,16,sum};
for(int i = 0;i<16;i++) {
for(int j = 0 ; j<16; j++) {
if( chessArr[i][j]!=0 ) {
parseArr[++row] = new int[] {i,j,chessArr[i][j]};
}
}
}
return parseArr;
}
//稀疏数组转回二维数组
public static int[][] backArr(int[][] parseArr) {
int[][] backArr = new int[ parseArr[0][0] ][ parseArr[0][1] ];
for(int i = 1 ; i < parseArr.length;i++) {
backArr[ parseArr[i][0] ] [ parseArr[i][1] ] = parseArr[i][2];
}
return backArr;
}
public static void printTwoArr(int[][] arrs) {
for(int[] arr:arrs) {
for(int i :arr) {
System.out.printf("%d\t",i);
}
System.out.println();
}
}
public static void OutputParseArray(int[][] parseArr) throws IOException {
// File file = new File("DataStructures");
// file.mkdir();
// OutputStream os = new FileOutputStream("DataStructures//map.txt");
// PrintWriter pw = new PrintWriter(os);
//
// for(int[] row :parseArr) {
// for(int i : row) {
// pw.println(i);
// }
//
// }
// pw.close();
//对象流
OutputStream os1 = new FileOutputStream("DataStructures//map.txt");
ObjectOutputStream oos = new ObjectOutputStream(os1);
oos.writeObject(parseArr);
oos.close();
}
public static int[][] InputParseArr() throws IOException, ClassNotFoundException {
/**int[][] backArr = null;
InputStream is =null;
InputStreamReader isw = null;
BufferedReader br = null;
try {
is = new FileInputStream("DataStructures//map.txt");
isw = new InputStreamReader(is);
br = new BufferedReader(isw);
backArr = new int[Integer.valueOf( br.readLine() )][Integer.valueOf( br.readLine() )];
int sum = Integer.valueOf( br.readLine() );
while(true) {
String s = br.readLine();
if(s == null) break;
backArr[Integer.valueOf( s )][Integer.valueOf( br.readLine() )] = Integer.valueOf( br.readLine() );
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return backArr;
}
*/
//对象流
InputStream is1 = new FileInputStream("DataStructures//map.txt");
ObjectInputStream ois = new ObjectInputStream(is1);
Object o = ois.readObject();
ois.close();
return (int[][]) o ;
}
}