zoukankan      html  css  js  c++  java
  • Java稀疏数组

    一、概述

      1、概念

      

      2、处理方法

      

      3、示例

      原数组如下:

       

      转换为稀疏数组如下:

      

    二、代码

      1、主方法

    @Test
    public void SparseTest() {
    // 创建一个原始的二维数组 11 * 11
    // 0: 表示没有棋子, 1 表示 黑子 2 表蓝子
    int[][] arr = new int[11][11];
    arr[1][1] = 1;
    arr[2][3] = 2;
    arr[4][5] = 2;
    System.out.println("原始数组");
    for (int[] tmp:arr) {
    for ( int t : tmp) {
    System.out.printf("%d ",t);
    }
    System.out.println();
    }

    int[][] sparseArr=ArrayToSparse(arr);
    //1.0输出稀疏数组
    System.out.println("输出稀疏数组");
    for (int i = 0; i < sparseArr.length; i++) {
    System.out.printf("%d %d %d ",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    System.out.println();
    }
    //2.0 将系数数组写入文件
    WriteSparseToFile(sparseArr,"xishu.txt");

    //3.0从文件中读出稀疏数组
    System.out.println("从文件中读出稀疏数组");
    int[][] readFileArray = ReadFileToArray("xishu.txt");
    for (int i = 0; i < sparseArr.length; i++) {
    System.out.printf("%d %d %d ",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    System.out.println();
    }
    //4.0从文件中读出稀疏数组,恢复成原来数组
    System.out.println("恢复出来的二维数组");
    int[][] ints = SparseToArray(readFileArray);
    for (int[] tmp:ints) {
    for ( int t : tmp) {
    System.out.printf("%d ",t);
    }
    System.out.println();
    }
    }

       2、实现数组转稀疏数组 

     1  //将数组转换为稀疏数组
     2     public int[][] ArrayToSparse(int[][] arr){
     3         //将二维数组转换为稀疏数组
     4         //1.0 遍历得到非零个数
     5         int sum = 0;
     6         for (int i = 0; i < arr.length; i++) {
     7             for (int j = 0; j < arr.length; j++) {
     8                 if(arr[i][j]!=0)
     9                     sum++;
    10             }
    11         }
    12         //2.0创建稀疏数组
    13         int[][] sparseArr = new int[sum+1][3];
    14         sparseArr[0][0]=11;
    15         sparseArr[0][1]=11;
    16         sparseArr[0][2] =sum;
    17 
    18         int count = 0;
    19         //3.0遍历 填充稀疏数组非零元素
    20         for (int i = 0; i < 11; i++) {
    21             for (int j = 0; j <11 ; j++) {
    22                 if(arr[i][j]!=0){
    23                     ++count;
    24                     sparseArr[count][0]=i;
    25                     sparseArr[count][1]=j;
    26                     sparseArr[count][2]=arr[i][j];
    27                 }
    28             }
    29         }
    30 
    31         return  sparseArr;
    32     }

       3、将稀疏数组写入文件

      

     1 public void WriteSparseToFile(int[][] sparseArr,String fileName){
     2         FileWriter fw=null;
     3         BufferedWriter bw=null;
     4         try {
     5            fw = new FileWriter(new File(fileName));
     6            bw = new BufferedWriter(fw);
     7             for (int i = 0; i < sparseArr.length; i++) {
     8 
     9                 String tmpStr ="";
    10                 for (int j = 0; j <sparseArr[i].length ; j++) {
    11                     tmpStr+=sparseArr[i][j]+" ";
    12                 }
    13                 tmpStr+="
    ";
    14                 bw.write(tmpStr);
    15                 bw.flush();
    16             }
    17         } catch (IOException e) {
    18             e.printStackTrace();
    19         }finally {
    20             if(bw!=null) {
    21                 try {
    22                     bw.close();
    23                 } catch (IOException e) {
    24                     e.printStackTrace();
    25                 }
    26             }
    27             if(fw!=null){
    28                 try {
    29                     fw.close();
    30                 } catch (IOException e) {
    31                     e.printStackTrace();
    32                 }
    33             }
    34 
    35         }
    36     }

       4、从文件中读出稀疏数组

      

     1 public int[][] ReadFileToArray(String fileName){
     2         FileReader fr = null;
     3         BufferedReader br = null;
     4         int[][] readArray={};
     5         try {
     6             fr = new FileReader(new File(fileName));
     7             br = new BufferedReader(fr);
     8 
     9             String lineStr="";
    10             ArrayList<String> list = new ArrayList<>();
    11             try {
    12                 while ((lineStr= br.readLine())!=null){
    13                     list.add(lineStr);
    14                 }
    15                 readArray = new int[list.size()][list.get(0).length()];
    16                 for (int i = 0;i<list.size() ; i++) {
    17                     String[] c = list.get(i).split(" ");
    18                     for (int j = 0; j <c.length ; j++) {
    19                         readArray[i][j]=Integer.parseInt(c[j]);
    20                     }
    21                 }
    22             } catch (IOException e) {
    23                 e.printStackTrace();
    24             }
    25         } catch (FileNotFoundException e) {
    26             e.printStackTrace();
    27         }finally {
    28             if(br!=null) {
    29                 try {
    30                     br.close();
    31                 } catch (IOException e) {
    32                     e.printStackTrace();
    33                 }
    34             }
    35             if(fr!=null){
    36                 try {
    37                     fr.close();
    38                 } catch (IOException e) {
    39                     e.printStackTrace();
    40                 }
    41             }
    42             return  readArray;
    43         }
    44 
    45 
    46     }

       5、稀疏数组转数组

     1  //将稀疏数组转换为数组
     2     public int[][] SparseToArray(int[][] sparseArr){
     3         //将稀疏数组恢复成数组
     4         //1.0先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
     5         int[][] arr  = new int[sparseArr[0][0]][sparseArr[0][1]];
     6         //2.0在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可
     7         for (int i = 1; i <sparseArr.length ; i++) {
     8             arr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
     9         }
    10 
    11         return arr;
    12     }

       

    三、运行结果

      

      

      

  • 相关阅读:
    [CF538F]A Heap of Heaps(主席树)
    [BZOJ1901][luogu2617]Dynamic Rankings(树状数组+主席树)
    [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
    [BZOJ2588]Count on a tree(LCA+主席树)
    [BZOJ2733][HNOI2012] 永无乡(线段树合并)
    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 (Treap+单调队列)
    【贪心】POJ2376-Cleaning Shifts
    【穷竭】POJ3187-Backward Digit Sums
    【枚举+贪心】POJ2718-Smallest Difference
    【BFS】POJ3669-Meteor Shower
  • 原文地址:https://www.cnblogs.com/hyunbar/p/11252385.html
Copyright © 2011-2022 走看看