稀疏数组与二维数组的转化

稀疏数组:

 一般使用在存在大量相同数据的表格中,存储了许多没有意义的数据。举个例子:一个数组存储了1000个数据,有效数据仅仅只有几个,就可以使用稀疏数组存储。

要求:

1.假设有一个11*11的棋盘,1代表白子,2代表黑子
2.目前棋盘上有三个棋子,分别位于二位数组的[1][2]白子、[2][3]白子、[3][4]黑子
3.创建对应的二维数组,并将其转化为稀疏数组存入map.data文件中

实现:

package sparsearr;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
* 二维数组与稀疏数组的转化
* */
public class SparseArray {
    public static void main(String[] args) throws IOException {
        /*
        1.假设有一个11*11的棋盘,1代表白子,2代表黑子
        2.目前棋盘上有三个棋子,分别位于二位数组的[1][2]白子、[2][3]白子、[3][4]黑子
        3.创建对应的二维数组,并将其转化为稀疏数组存入map.data文件中
        */

        //创建对应的二位数组
        int[][] chessArr = new int[11][11];
        //存入数据
        chessArr[1][2] = 1;
        chessArr[2][3] = 1;
        chessArr[3][4] = 2;
        //遍历数组,获取其中有效数据的条数并记录
        int sum = 0;
        System.out.println("原始数组:");
        for (int i =0;i<chessArr.length;i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                System.out.printf("%d\t", chessArr[i][j]);
                if (chessArr[i][j] != 0)
                    sum++;
            }
            System.out.println();
        }
        System.out.println("原始数组中的有效数据条数为:"+sum);

        System.out.println("------------------------------------");
        //将二维数组转换为稀疏数组
        //创建稀疏数组,行数=有效数据+1;列数=3
        int[][] sparseArray = new int[sum+1][3];
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;
        //定义行变量
        int count = 0;
        for (int i = 0;i<chessArr.length;i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j] != 0){
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArr[i][j];
                }
            }
        }

        //输出稀疏数组,并将稀疏数组存入map.data
        BufferedWriter bw = new BufferedWriter(new FileWriter("map.data"));
        System.out.println("稀疏数组:");
        for(int[] sparse : sparseArray){
            for(int data : sparse){
                bw.write(data+" ");
                System.out.printf("%d\t",data);
            }
            bw.newLine();
            System.out.println();
        }
        //关闭资源
        bw.close();
    }
}

结果:

 

map.data :

 要求:

1.读取上述map.data文件,将其存入稀疏数组
2.将稀疏数组转化为二维数组并输出

实现:

package sparsearr;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class SparseArray2 {
    public static void main(String[] args) throws IOException {
        /*
        * 1.读取上述map.data文件,将其存入稀疏数组
        * 2.将稀疏数组转化为二维数组并输出
        * */
        BufferedReader br = new BufferedReader(new FileReader("map.data"));
        //定义稀疏数组
        int[][] sparseArray = new int[4][3];
        String str;
        int count = 0;
        //获取数据
        while((str=br.readLine())!=null){
            //将每行数据拆分为单个数据
            String[] s = str.split(" ");
            for(int i = 0;i<s.length;i++){
                sparseArray[count][i] = Integer.parseInt(s[i]);
            }
            count++;
        }
        //遍历稀疏数组
        System.out.println("稀疏数组:");
        for(int[] arr : sparseArray){
            for(int data : arr){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        System.out.println("-----------------------------");
        //将稀疏数组转化为二维数组
        int[][] chessArray = new int[sparseArray[0][0]][sparseArray[0][1]];
        //遍历稀疏数组,将数据添加到二维数组
        for(int i = 1;i<sparseArray.length;i++){
            chessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        //遍历二维数组
        System.out.println("恢复后的二维数组:");
        for(int[] arr : chessArray){
            for(int data : arr){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        br.close();
    }
}

结果:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值