稀疏数组算法之五子棋写入读取例子

今天学习了老韩的数据结构和算法,我就将代码和课后作业记录下来,方便以后参考学习

如下图:棋盘可以看做是一个二维数组,如果将黑子用1表示,蓝子用2表示,空白的地方用0表示,如果我们直接将棋盘数据存入二维数组,则数组中会存在大量的0,因此记录了很多没有意义的数据,于是,我们便想到将数据进行压缩,用稀疏数组来存放数据更佳。

代码实现—SparseArray类

public class SparseArray {
    public static void main(String[] args) {
     //调用没有文件写入读取原方法  originalMethod();      //调用有文件写入读取新方法
try { newMethod(); } catch (Exception e) { e.printStackTrace(); } } //没有文件写入读取原方法 public static void originalMethod(){ //创建一个原始的二维数组 11*11 //0 表示没有棋子 1 表示黑子 2 表示蓝子 int chessArr1[][]=new int[11][11]; chessArr1[1][2]=1; chessArr1[2][3]=2; chessArr1[3][4]=5; //输出二维数组 System.out.println("原始的二维数组-----"); for (int[] row:chessArr1 ) { for (int data:row ) { System.out.printf("%d\t",data); } System.out.println(); } //将二维数组转为稀疏数组 //1.遍历二维数组,得到非0的数据的个数 int sum=0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { sum++; } } } System.out.println("sum的个数:"+sum); //创建稀疏数组 int sparseArr[][]=new int[sum+1][3]; //给稀疏数组赋值 sparseArr[0][0]=chessArr1.length; sparseArr[0][1]=chessArr1.length; sparseArr[0][2]=sum; //遍历二维数组,将非0的值存放到sparseArr中 int count=0;//用于记录非零数据 for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { count++; sparseArr[count][0]=i; sparseArr[count][1]=j; sparseArr[count][2]=chessArr1[i][j]; } } } //输出稀疏数组 System.out.println(); System.out.println("输出稀疏数组-----"); for (int i = 0; i < sparseArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); } //将稀疏数组转为二维数组 int chessArr2[][]=new int[sparseArr[0][0]][sparseArr[0][1]]; //读取稀疏数组后几行的数据(从第二行开始),并赋值给原始的二维数组 for (int i = 1; i < sparseArr.length; i++) { chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2]; } //输出恢复后的二维数组 System.out.println("恢复后的二维数组-----"); for (int[] row:chessArr2 ) { for (int data:row ) { System.out.printf("%d\t",data); } System.out.println(); } } //有文件写入读取新方法 public static void newMethod() throws Exception{ //创建一个原始的二维数组 11*11 //0 表示没有棋子 1 表示黑子 2 表示蓝子 int chessArr1[][]=new int[11][11]; chessArr1[1][2]=1; chessArr1[2][3]=2; chessArr1[3][4]=5; //输出二维数组 System.out.println("原始的二维数组-----"); for (int[] row:chessArr1 ) { for (int data:row ) { System.out.printf("%d\t",data); } System.out.println(); } //将二维数组转为稀疏数组 //1.遍历二维数组,得到非0的数据的个数 int sum=0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { sum++; } } } System.out.println("sum的个数:"+sum); //创建稀疏数组 int sparseArr[][]=new int[sum+1][3]; //给稀疏数组赋值 sparseArr[0][0]=chessArr1.length; sparseArr[0][1]=chessArr1.length; sparseArr[0][2]=sum; //遍历二维数组,将非0的值存放到sparseArr中 int count=0;//用于记录非零数据 for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { count++; sparseArr[count][0]=i; sparseArr[count][1]=j; sparseArr[count][2]=chessArr1[i][j]; } } } // 保存稀疏数组 File file = new File("map.data"); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter write = new OutputStreamWriter(fos, "UTF-8"); //输出稀疏数组 System.out.println(); System.out.println("输出稀疏数组-----"); for (int i = 0; i < sparseArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); if (i == sparseArr.length - 1) { write.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]); } else { write.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ","); } } System.out.println("写入文件中..."); write.close(); fos.close(); System.out.println("打开文件中..."); Desktop.getDesktop().open(file); System.out.println("-------读取map.data"); // 创建 FileReader 对象 FileInputStream fis = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read());// 转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close();// 关闭读取流 fis.close();// 关闭输入流,释放系统资源 //创建新的稀疏数组 String[] str = sb.toString().split(","); int chessArr2[][]= new int[str.length / 3][3]; // 给稀疏数组赋值 int i = 0; for (String s : str) { chessArr2[i/3][i % 3]=Integer.parseInt(s); i++; } // 1. 读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 int chessArr22[][] = new int[chessArr2[0][0]][chessArr2[0][1]]; // 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可. for (int i3 = 1; i3 < chessArr2.length; i3++) { chessArr22[chessArr2[i3][0]][chessArr2[i3][1]] = chessArr2[i3][2]; } //输出恢复后的二维数组 System.out.println("恢复后的二维数组-----"); for (int[] row:chessArr2 ) { for (int data:row ) { System.out.printf("%d\t",data); } System.out.println(); } } }

 

posted @ 2020-11-08 23:45  千夜大魔王  阅读(139)  评论(1编辑  收藏  举报