101、scala-稀疏数组介绍

    技术2022-07-11  81

    什么是稀疏数组

    当一个数组中的数据大部分都是默认数据,此时数组数据需要存盘的情况下,大量默认数据也会占用存储空间。稀疏数组正是用于解决此类问题,稀疏数组只存在数据在原始数组中的位置及值,在存盘时只报存稀疏数组中的数据即可;当读取文件时根据稀疏数组来还原 原始数组。

    作用:减少存储空间,起到类似数据压缩的作用。

    下面就来使用一个简单案例介绍一下稀疏数组的使用

    问题引出:

    下面介绍一个游戏-五子棋,大家都知道棋盘是一个纵横交错的线划分而成的,其实转变一下就变成了编程中的二维数组,每个点都是数组中的一个坐标,下就来代入一下

    * 二维数组模拟五子棋棋盘 * 1:白子;2:黑子 * 棋盘效果模拟图如下: * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 1 0 0 0 0 0 0 0 0 * 0 0 0 2 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 //1.定义行列的长度 val rowSize = 11 val colSize = 11 //2.定义二维数组 val array = Array.ofDim[Int](rowSize, colSize) array(1)(2) = 1 array(2)(3) = 2

    问题:如下棋盘是一个二维数组保存数据,假设此时棋手需要暂存游戏下次继续玩,而此时棋盘上面棋子并不多,如果对整个数组中数据进行存盘则默认无子也会占用空间。

    解决:在棋子不多的情况下,使用稀疏数组来记录每个棋子的横纵坐标以及棋子类型即可,在实际存盘时只需要保存这些已经落下的棋子即可

    //记录一个棋子数据,行-列-值 class Node(val row: Int, val col: Int, val value: Int) { override def toString: String = row + "\t" + col + "\t" + value }

    下面使用完整代码演示:

    object SparseArr { def main(args: Array[String]): Unit = { //1.定义行列的长度 val rowSize = 11 val colSize = 11 //2.定义二维数组 val array = Array.ofDim[Int](rowSize, colSize) array(1)(2) = 1 array(2)(3) = 2 var count: Int = 2 //记录棋子个数 //3.查看棋盘 showQipan(array) //4. 稀疏数组解决存储过大问题 //问题:由棋盘显示可以看出默认无子为0,则在棋子较少时保存棋盘情况入磁盘时0也会占用存储空间,怎么来进行存储空间优化? //解决:在棋子较少时,使用稀疏数组来保存已经落下的棋子位置,因为无子默认为0则不用保存,这样会减少实际存储空间 //其实在定义这个数组时可以根据已经落下多少颗棋子来定义 val sparseArr = new ArrayBuffer[Node](count + 1) //多出一个记录棋盘大小 val node = new Node(rowSize, colSize, 0) //棋盘大小 sparseArr.append(node) //保存棋子 for (i <- 0 until array.length) { for (j <- 0 until array(i).length) { //棋子不为0保存 if (array(i)(j) != 0) { sparseArr.append(new Node(i, j, array(i)(j))) } } } //5. 文件io操作 val datas = showSparseArr(sparseArr) //显示稀疏数组结果 //落地为磁盘文件 val fileName = "d:/1.txt" FileUtil.write(fileName)(datas) println("------------文件读取----------") //文件数据加载 val nodes = FileUtil.read(fileName) nodes.foreach(println(_)) println("------------稀疏数组还原棋盘----------") //6.根据文件读取数据,还原完整棋盘 val ar2 = Array.ofDim[Int](rowSize, colSize) for (i <- 1 until nodes.length) { val node = nodes(i) ar2(node.row)(node.col) = node.value } for (items <- ar2) { for (i <- items) { print(i + "\t") } println() } } //棋盘显示函数 def showQipan(array: Array[Array[Int]]): Unit = { for (items <- array) { for (i <- items) { print(i + "\t") } println() } } def showSparseArr(arr: ArrayBuffer[Node]) = { val strs = new ArrayBuffer[String]() for (node <- arr) { // println(node) strs.append(node.toString) } strs.toArray } } //记录一个棋子数据,行-列-值 class Node(val row: Int, val col: Int, val value: Int) { override def toString: String = row + "\t" + col + "\t" + value }

    终结:当数组中数据大量是默认数据时需要存盘,则可以使用稀疏数据完成数据压缩作用

    Processed: 0.010, SQL: 9