首页 > 其他分享 >稀疏数组(sparseArray)

稀疏数组(sparseArray)

时间:2023-11-22 10:44:24浏览次数:25  
标签:sparseArray chessArray int 稀疏 sparsArr ++ 数组 dis

稀疏数组

1.二维数组转成稀疏数组

//        将二维数组转成稀疏数组
//        1.得到非零个数sum
        int sum = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0)
                    sum++;
            }
        }
//        2.创建稀疏数组行数sum+1,列数固定,行数、列数和有效值
        int[][] sparsArr = new int[sum + 1][3];
//        第一行记录二维数组的行数、列数和有效值个数
        sparsArr[0][0] = 11;
        sparsArr[0][1] = 11;
        sparsArr[0][2] = sum;
//        用于记录是第几个非零数据
        int count = 0;
//        遍历二维数组,将非零值存放到sparseArr中
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0) {
                    count++;
                    sparsArr[count][0] = i;
                    sparsArr[count][1] = j;
                    sparsArr[count][2] = chessArray[i][j];
                }

            }
        }
        System.out.println("稀疏数组为~~~~");
        for (int i = 0; i < sparsArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparsArr[i][0], sparsArr[i][1], sparsArr[i][2]);
        }

2.将稀疏数组保存的本地

public static void saveSparseArrToFile(int[][] sparse, String filepath) throws Exception {
//        写入文件
        FileOutputStream fos = new FileOutputStream(filepath);
        DataOutputStream dos = new DataOutputStream(fos);
        for (int[] row : sparse) {
            for (int data : row) {
                dos.writeInt(data);
            }
        }
        if (dos != null)
            dos.close();
        if (fos != null)
            fos.close();
    }

3.将本地文件数据读取到稀疏数组中

public static int[][] getSparseArrFromFile(String filePath) throws Exception {
        int[][] arr = {};
        FileInputStream fis = new FileInputStream(filePath);
        DataInputStream dis = new DataInputStream(fis);
//        读取第一行数据
        int row = dis.readInt();
        int col = dis.readInt();
        int count = dis.readInt();
//        第一行代表几行几列几个非零数
        arr = new int[row][col];
//        根据count给arr赋值
        for (int i = 0; i < count; i++) {
            arr[dis.readInt()][dis.readInt()] = dis.readInt();

        }
        if (dis != null)
            dis.close();
        if (fis != null)
            fis.close();
        return arr;
    }

4.将稀疏数组转成原始的二维数组

//        将稀疏数组转成原始的二维数组
//        读取第一行的,将第一行的数据,创建原始的数组
        int[][] chessArray2 = new int[sparsArr[0][0]][sparsArr[0][1]];
//        读取稀疏数组后几行的数据(从第二行开始),并赋值给原始的二维数组
        for (int i = 1; i < sparsArr.length; i++) {
            chessArray2[sparsArr[i][0]][sparsArr[i][1]] = sparsArr[i][2];
        }
//        输出恢复后的二维数组
        System.out.println();
        System.out.println("输出恢复后的二维数组~~");
        for (int[] row : chessArray2) {
            for (int data : row) {
                System.out.print(data + " ");
            }
            System.out.println();
        }
    }

5.测试的代码

/**
 * @author 缪广亮
 * @version 1.0
 */
public class SparseArray01 {
    public static void main(String[] args) throws Exception {
//        将一个11x11的二维数组
        int[][] chessArray = new int[11][11];
//        0:无子;1:黑子;2:蓝子
        chessArray[1][2] = 1;
        chessArray[2][3] = 2;
        for (int[] row : chessArray) {
            for (int data : row) {
                System.out.print(data + " ");
            }
            System.out.println();
        }
//        将二维数组转成稀疏数组
//        1.得到非零个数sum
        int sum = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0)
                    sum++;
            }
        }
//        2.创建稀疏数组行数sum+1,列数固定,行数、列数和有效值
        int[][] sparsArr = new int[sum + 1][3];
//        第一行记录二维数组的行数、列数和有效值个数
        sparsArr[0][0] = 11;
        sparsArr[0][1] = 11;
        sparsArr[0][2] = sum;
//        用于记录是第几个非零数据
        int count = 0;
//        遍历二维数组,将非零值存放到sparseArr中
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0) {
                    count++;
                    sparsArr[count][0] = i;
                    sparsArr[count][1] = j;
                    sparsArr[count][2] = chessArray[i][j];
                }

            }
        }
        System.out.println("稀疏数组为~~~~");
        for (int i = 0; i < sparsArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparsArr[i][0], sparsArr[i][1], sparsArr[i][2]);
        }
//        //4.将稀疏数组保存到文件中
//        String filePath = "E:\\sparseArr.txt";
//        saveSparseArrToFile(sparsArr, filePath);
//
//        //5.将文件数据读取到稀疏数组中
//        int[][] fileSparseArr = getSparseArrFromFile(filePath);
//        //打印读取的稀疏数组
//        System.out.println("打印读取转换后的二维数组:\n----------------------------");
//        for (int[] row : fileSparseArr) {
//            for (int data : row) {
//                System.out.print(data+" ");
//            }
//            System.out.println();
//        }
//        将稀疏数组转成原始的二维数组
//        读取第一行的,将第一行的数据,创建原始的数组
        int[][] chessArray2 = new int[sparsArr[0][0]][sparsArr[0][1]];
//        读取稀疏数组后几行的数据(从第二行开始),并赋值给原始的二维数组
        for (int i = 1; i < sparsArr.length; i++) {
            chessArray2[sparsArr[i][0]][sparsArr[i][1]] = sparsArr[i][2];
        }
//        输出恢复后的二维数组
        System.out.println();
        System.out.println("输出恢复后的二维数组~~");
        for (int[] row : chessArray2) {
            for (int data : row) {
                System.out.print(data + " ");
            }
            System.out.println();
        }
    }

    public static void saveSparseArrToFile(int[][] sparse, String filepath) throws Exception {
//        写入文件
        FileOutputStream fos = new FileOutputStream(filepath);
        DataOutputStream dos = new DataOutputStream(fos);
        for (int[] row : sparse) {
            for (int data : row) {
                dos.writeInt(data);
            }
        }
        if (dos != null)
            dos.close();
        if (fos != null)
            fos.close();
    }

    public static int[][] getSparseArrFromFile(String filePath) throws Exception {
        int[][] arr = {};
        FileInputStream fis = new FileInputStream(filePath);
        DataInputStream dis = new DataInputStream(fis);
//        读取第一行数据
        int row = dis.readInt();
        int col = dis.readInt();
        int count = dis.readInt();
//        第一行代表几行几列几个非零数
        arr = new int[row][col];
//        根据count给arr赋值
        for (int i = 0; i < count; i++) {
            arr[dis.readInt()][dis.readInt()] = dis.readInt();

        }
        if (dis != null)
            dis.close();
        if (fis != null)
            fis.close();
        return arr;
    }
}

标签:sparseArray,chessArray,int,稀疏,sparsArr,++,数组,dis
From: https://www.cnblogs.com/mglblog/p/17848425.html

相关文章

  • C#使用随机数生成元素不重复的数组
    通过for与while的嵌套做了一个排除相同数字的审查机制,如果生成了数组中已有的数字就重新生成一个数字,继续循环排查,直到生成的数字是数组中不存在的数字数组长度不能超过随机数范围否则会死循环usingSystem;namespacenotRepeat{classProgram{staticvo......
  • loj144&145 dfs序+树状数组/线段树
    https://loj.ac/p/144https://loj.ac/p/145两题非常相似,一题的权值修改是在点上的,一题的权值修改是在整棵子树上的。首先我们要了解dfs序,并记录每个节点的子树大小sz,对于一个节点,在dfs序上sz长的区间全都是他的子节点以及他自己。所以我们将一棵树映射到了一个区间上,并且可......
  • 数组元素的目标和(双指针)
    一、题目来源AcWing算法基础课-800.数组元素的目标和二、题目描述给定两个升序排序的有序数组\(A\)和\(B\),以及一个目标值\(x\)。数组下标从\(0\)开始。请你求出满足\(A[i]+B[j]=x\)的数对\((i,j)\)。数据保证有唯一解。输入格式第一行包含三个整数\(n,m,......
  • 二维字符数组特殊提醒
    如果要对二维字符数组一个一个位置赋初值,一定要像下面这么做chars[5][5],s1[5][5];for(inti=0;i<5;i++)for(intj=0;j<4;j++)//一定要注意j最多只能到3,因为最后一个位置要用来放停止符{s[i][j]=j+(int)'0';s[i][4]='\0';//一定要手动给最后一个位置放停止符}for......
  • 反转数组
    publicclassFanZhuan{publicstaticvoidmain(String[]args){int[]a={10,20,30,40,50,60};for(inti=0,j=a.length-1;i<j;i++,j--){inttemp=a[j];//建立一个零时变量int=tempa[j]=a[i];......
  • 2维区间树状数组
    voidadd(llx,lly,llz){for(intX=x;X<=n;X+=X&-X)for(intY=y;Y<=m;Y+=Y&-Y){t1[X][Y]+=z;t2[X][Y]+=z*x;t3[X][Y]+=z*y;t4[X][Y]+=z*x......
  • LeetCode-Java:88合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......
  • 三种办法遍历对象数组,获取数组对象中所有的属性值(key,value);四种方法查找对象数组里面
    一,获取对象数组中某属性的所有值如果是要获取具体第几个属性的值,倒是可以用arr[i].name的方法来实现。若是全部的属性的值,并返回一个新的数组嘞,思路是加循环遍历方法如下。1、from方法vararr=[{id:1,name:"小明"},{id:2......
  • [4] 寻找两个正序数组的中位数
    /***@param{number[]}nums1*@param{number[]}nums2*@return{number}*/varfindMedianSortedArrays=function(nums1,nums2){constnums=nums1.concat(nums2).sort((a,b)=>a-b)constll=nums.lengthif(ll%2===0){return......
  • 数组中的指定某一项放置第一位
    constarr=[]this.todoLeftList.forEach((item)=>{arr.push(item.srcSystemCode)})constindex=arr.indexOf('zldc')if(index){constfirst=this.todoLeftList.splice(index,1)[0]this.todoLeftList.unshift(first)} constarr=[]this.tod......