数据结构与算法01

稀疏数组

1.二维数组转化为稀疏数组
2.稀疏数组换为二维数组


```java
package dataStructure.SparseArr;


public class SparseArray {
    public static void main(String[] args) {
        // 创建一个原始的二维数组 11*11
        // 0:表示没有棋子 1:表示黑子 2:表示白子
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[3][4] = 2;
        // 输出原始的二维数组
        System.out.println("原始的二维数组~~");
        for (int[] row : chessArr1){    //遍历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);
        // 2.创建对应的稀疏数组
        int[][] sparseArr = new int[sum+1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        // 3.遍历二维数组,将非0的值存放到稀疏数组中
        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();
        System.out.println("还原成二维数组~~·");
        for (int[] row : chessArr2){
            for (int data : row){
                System.out.printf("%d\t",data);

            }
            System.out.println();
        }
    }
}



// 1.将稀疏数组保存到磁盘上,比如map.data
// 2.恢复原来的数组时,读取map.data进行恢复
3.存入文件,读取文件

```java
package dataStructure.SparseArr;
// 二维数组 到稀疏数组  稀疏数组到二维数组  把数组元素存入文件中
import java.io.*;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;

public class sparseArr0 {
    public static void main(String[] args) {
        //一、创建一个原始的二维数组10 * 10
        int[][] chessArr1 = new int[10][10];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[3][4] = 3;
        //输出原始的二维数组
        System.out.println("原始二维数组为:");
        for(int[] a : chessArr1) {
            for(int b : a) {
                System.out.printf("%d\t", b);//格式化输出
            }
            System.out.println();
        }
        System.out.println("-----------------------------------------------");

        //二、将原始二维数组转换成稀疏数组
        //1.先遍历原始二维数组,得到非零数据的个数
        int sum = 0;
        for(int i = 0; i < chessArr1.length; i++) {
            for(int j = 0; j < chessArr1[i].length; j++) {
                if(chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }
        //2.创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];//多出的一行用于记录原始二维数组的行数、列数及有效数的个数
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1[0].length;
        sparseArr[0][2] = sum;
        //3.将原始二维数组中的有效数存入稀疏数组
        int count = 0;//在稀疏数组中,除第一行(数组行下标为0)外,其余每行表示一个有效数
        for(int i = 0; i < chessArr1.length; i++) {
            for(int j = 0; j < chessArr1[i].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("稀疏数组为:");
        //由于稀疏数组只有三列,所以可以用单个for循环输出,从而避免用时间复杂度较大的嵌套循环
        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]);
        }

        //三、将稀疏数组恢复成原始二维数组
        //1.先读取稀疏数组的第一行(数组行下标为0),根据第一行的数据确定原始二维数组的大小
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.读取稀疏数组的后几行数据,并赋值给原始的二维数组
        for(int i = 1; i < sparseArr.length; i++) {//i=1表示稀疏数组的第二行,稀疏数组的第二行才是存的原始二维数组中的有效值信息
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        //输出恢复后的二维数组
        System.out.println("-----------------------------------------------");
        System.out.println("恢复的原始二维数组为:");
        for(int[] a : chessArr2) {
            for(int b : a) {
                System.out.printf("%d\t", b);
            }
            System.out.println();
        }
        System.out.println("-----------------------------------------------");
        System.out.println("-----------------------------------------------");

        //四、将稀疏数组保存到磁盘上,如map.data
        try {
            System.out.println("将稀疏数组保存到磁盘并命名为map.data");
            File f = new File("F:\\map.txt");
            FileOutputStream fos = new FileOutputStream(f);
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            System.out.println("写入中----------");
            for(int i = 0; i < sparseArr.length; i++) {
                osw.write(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");
            }
            osw.close();//关闭输出流
            fos.close();//关闭输出流
            System.out.println("写入磁盘成功");
            //读取磁盘中的map.data文件
            System.out.println("读取中----------");
            FileInputStream fis = new FileInputStream(f);
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            StringBuffer sb = new StringBuffer();
            while(isr.ready()) {
                sb.append((char)isr.read());
            }
            isr.close();//关闭输入流
            fis.close();//关闭输入流
            System.out.println("读取成功");
            String ss = sb.toString();
            String[] sb1 = sb.toString().split(",");
            System.out.printf("从磁盘读取的字符串为:\n%s\n", ss);//格式化输出
            //恢复稀疏数组
            int sum1 = 0;
            int[][] sparseArr1 = new int[sb1.length/3][3];
            sparseArr1[0][0] = Integer.parseInt(sb1[0]);
            sparseArr1[0][1] = Integer.parseInt(sb1[1]);
            sparseArr1[0][2] = Integer.parseInt(sb1[2]);
            for(int i = 3; i < sb1.length; i += 3) {
                sum1++;
                sparseArr1[sum1][0] = Integer.parseInt(sb1[i]);
                sparseArr1[sum1][1] = Integer.parseInt(sb1[i+1]);
                sparseArr1[sum1][2] = Integer.parseInt(sb1[i+2]);
            }
            System.out.println("还原后的稀疏数组为:");
            for(int i = 0; i < sparseArr1.length; i++) {
                System.out.printf("%d\t%d\t%d\n", sparseArr1[i][0], sparseArr1[i][1], sparseArr1[i][2]);
            }
            //恢复原始二维数组
            int[][] chessArr3 = new int[sparseArr1[0][0]][sparseArr1[0][1]];
            for(int i = 1; i < sparseArr1.length; i++) {
                chessArr3[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
            }
            System.out.println("还原后的二维数组为:");
            for(int[] a : chessArr3) {
                for(int b : a) {
                    System.out.printf("%d\t", b);
                }
                System.out.println();
            }
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值