Java数据结构与算法--将稀疏数组保存到硬盘,并恢复

在这里插入图片描述

    // 稀疏数组代码实现
    // 一、创建原始二维数组
    int[][] begin = new int[11][11];
    // 向原始数组中添加元素
    begin[2][3] = 16;
    begin[3][4] = 18;
    begin[6][6] = 168;
    // 遍历原始数组
    // 统计有效元素个数
    int sum = 0;
    System.out.println("原始数组为:");
    for (int[] ints : begin){
        for (int ele : ints){
            System.out.print(ele + " ");
            if (ele != 0) sum++;
        }
        System.out.println();
    }

    // 二、将原始数组转换为稀疏数组
    // 创建稀疏数组
    int[][] sparseArray = new int[sum+1][3];
    // 为稀疏数组第一行添加数据
    sparseArray[0][0] = 11;
    sparseArray[0][1] = 11;
    sparseArray[0][2] = sum;
    // 为稀疏数组添加数据(从第二行开始)
    // count代表稀疏数组行号
    int count = 1;
    // 遍历原始数组,将有效元素的行数、列数、值添加进稀疏数组中
    // i代表原始数组行号,k代表原始数组列号
    for (int i = 0; i < 11; i++){
        for (int k = 0; k < 11; k++){
            if (begin[i][k] != 0){
                sparseArray[count][0] = i;
                sparseArray[count][1] = k;
                sparseArray[count][2] = begin[i][k];
                count++;
            }
        }
    }
    // 遍历稀疏数组
    System.out.println("稀疏数组为:");
    for (int i = 0; i < sparseArray.length; i++){
        System.out.println(sparseArray[i][0] + " " + sparseArray[i][1] + " " + sparseArray[i][2]);
    }

    // 三、将稀疏数组保存进硬盘
    System.out.println("将稀疏数组保存到硬盘");
    // 创建一个输出流
    FileWriter writer = null;
    try {
        writer = new FileWriter("F:\\数据结构和算法\\IDEA代码\\稀疏数组\\map.data");
        // 将稀疏数组写进IO流中,一边遍历一遍写
        for (int i = 0; i < sparseArray.length; i++){
            writer.write(sparseArray[i][0] + " " + sparseArray[i][1] + " " + sparseArray[i][2] + " ");
        }
        writer.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (writer != null) {
        try {
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("保存成功");

    // 四、从硬盘中读取稀疏数组
    System.out.println("从硬盘中读取稀疏数组");
    // 创建一个输入流
    FileReader reader = null;
    // 定义一个字符串缓冲对象用来接收读取到的字符
    StringBuffer sb = null;
    try {
        reader = new FileReader("F:\\数据结构和算法\\IDEA代码\\稀疏数组\\map.data");
        sb = new StringBuffer();
        // 通过Reader类的read()方法读取单个字符,并将其转换成char类型
        while(reader.ready()){
            sb.append((char) reader.read());
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("读取成功");
    // 将读取到的字符转换成字符串
    String s = sb.toString();
    System.out.println(s);
    // 将字符串切割成String数组
    String[] strings = s.split(" ");

    // 转换为稀疏数组
    int[][] sparseArray2 = new int[strings.length/3][3];
    // 为恢复后稀疏数组的第一行赋值
    // 将String转换成int,使用Integer.parseInt()方法
    sparseArray2[0][0] = Integer.parseInt(strings[0]);
    sparseArray2[0][1] = Integer.parseInt(strings[1]);
    sparseArray2[0][2] = Integer.parseInt(strings[2]);
    // 为恢复后稀疏数组其它行赋值(从第二行开始)
    int line = 1;
    // 此处i为strings数组中元素下标
    for (int i = 3; i < strings.length; i+=3){
        sparseArray2[line][0] = Integer.parseInt(strings[i]);
        sparseArray2[line][1] = Integer.parseInt(strings[i + 1]);
        sparseArray2[line][2] = Integer.parseInt(strings[i + 2]);
        line++;
    }

    System.out.println("还原后的稀疏数组为:");
    for (int i = 0; i < sparseArray2.length; i++){
        System.out.println(sparseArray2[i][0] + " " + sparseArray2[i][1] + " " + sparseArray2[i][2]);
    }

    // 五、稀疏数组还原为原始数组
    int[][] overArray = new int[sparseArray2[0][0]][sparseArray2[0][1]];
    for (int i = 1; i < sparseArray2.length; i++){
        overArray[sparseArray2[i][0]][sparseArray[i][1]] = sparseArray2[i][2];
    }
    System.out.println("还原后的原始数组为:");
    for (int[] ints : overArray){
        for (int ele : ints){
            System.out.print(ele + " ");
        }
        System.out.println();
    }



}

}

你可能感兴趣的:(java)