Java数据结构实现稀疏数组

首先什么是稀疏数组呢?
当一个数据大部分为0或者大部分都为1时,可以用另外一个数组来保存它,节约空间。
先用图片表示
在这里插入图片描述
将二维数组转化为稀疏数组的思路:
1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
3.将二维数组的有效数据存入到稀疏数组中

稀疏数组转化为二维数组的思路:
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;
2.再读取稀疏数组的数据,并且赋值给数据就可以了。

public class SparseArray {


    public static void main(String[] args){
        //创建一个原始的11*11的数组
        //0表示没有棋子,1表示黑子,2表示白子

        int chessArray[][] = new int[11][11];
        chessArray[1][2] = 1;
        chessArray[2][3] = 2;
        chessArray[8][5] = 2;
        //先打印原始的数组

        for (int[] row : chessArray){
            for (int data : row){
                System.out.printf("%d\t",data);//格式化输出
            }
            System.out.printf("\n");
        }

        //将其转化为稀疏数组
        int sum = 0;
        for (int[] row : chessArray){
            for (int data : row){
                if (data != 0){
                    sum++;
                }
            }
        }
        //输出有效个数
        System.out.printf("有效个数:"+sum);

        //初始化稀疏数组
        int  sparsearray[] [] = new int[sum+1][3];

        int sparserow = 1;
         sparsearray[0][0] = 11;
         sparsearray[0][1] = 11;
         sparsearray[0][2] = sum;
         for (int i = 0; i<chessArray.length; i++){
             for (int j = 0; j<chessArray[i].length; j++){
                 if (chessArray[i][j] != 0){
                     sparsearray[sparserow][0] = i;
                     sparsearray[sparserow][1] = j;
                     sparsearray[sparserow][2] = chessArray[i][j];
                     sparserow++;
                 }
             }
         }

         //稀疏数组输出
        System.out.printf("输出稀疏数组\n");
        for (int[] row : sparsearray){
            for (int data : row){
                System.out.printf("%d\t",data);//格式化输出
            }
            System.out.printf("\n");
        }

        //将稀疏矩阵存入磁盘中

        File file = new File("d:\\SparseArray.txt");
        try {
            FileWriter out = new FileWriter(file);
             for (int i = 0 ; i<sparsearray[0].length ; i++){
                 for (int j = 0 ;j < sparsearray[i].length ; j++){
                     out.write(sparsearray[i][j]+"\t");
                 }
                 out.write("\r\n");
             }
             out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


        //将稀疏数组从文件中读出来
        try {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String line;
            int renderrow = 0;
            //逐行读取,将每个数据放入到数组中,
            while ((line = in.readLine()) != null){
                String[] temp = line.split("\t");
                for (int j =0 ; j<temp.length;j++){
                    sparsearray[renderrow][j] = Integer.parseInt(temp[j]);
                }
                renderrow++;
            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        //将稀疏数组转化为二位数组
        int rowlength = sparsearray[0][0];
        int leilength = sparsearray[0][1];

        int erweiarray[][] = new int[rowlength][leilength];

        for (int i = 1 ;i <= sparsearray[0][2] ; i++){
            erweiarray[sparsearray[i][0]][sparsearray[i][1]] = sparsearray[i][2];
        }

        //输出二维数组
        System.out.printf("输出二维数组\n");
        for (int[] row : erweiarray){
            for (int data : row){
                System.out.printf("%d\t",data);//格式化输出
            }
            System.out.printf("\n");
        }
    }
}

发布了34 篇原创文章 · 获赞 15 · 访问量 3223

猜你喜欢

转载自blog.csdn.net/weixin_43404016/article/details/105177155