李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Scala稀疏数组练习
Leefs
2021-04-19 PM
1163℃
0条
# 18.Scala稀疏数组练习 ### 一、概念 当一个数组中大部分元素为 0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法: > + 记录数组一共有几行几列,有多少个不同的值。 > + 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。 **稀疏数组举例说明** ![18.Scala稀疏数组练习01.png](https://lilinchao.com/usr/uploads/2021/04/2588348597.png) ### 二、应用实例 **描述** > 1. 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)。 > 2. 把稀疏数组存盘,并且可以重新恢复原来的二维数组数。 **整体思路分析如下** ![18.Scala稀疏数组练习02.png](https://lilinchao.com/usr/uploads/2021/04/1434530431.png) **代码** ```scala import java.io.{File, PrintWriter} import scala.collection.mutable.ArrayBuffer import scala.io.Source /** * * @author Leefs * @date 2021/4/19 * @description 1.0 * **/ object SparseArrayDemo01 { def main(args: Array[String]): Unit = { //演示一个稀疏数组的使用 val rowSize = 11 val colSize = 11 //用于创建数组的一种方式 val chessMap = Array.ofDim[Int](rowSize,colSize) //初始化棋盘地图 chessMap(1)(2) = 1 //1 表示黑子 chessMap(2)(3) = 2 //2 表示白子 println("----------原始的棋盘地图-------------------") //输出原始的棋盘地图 for(item1 <- chessMap){ for(item2 <- item1){ printf("%d\t",item2) } println() } val sparseArrayData = arrayToSparsArray(rowSize,colSize,chessMap) println("----------输出稀疏数组----------") //输出稀疏数组 for(node <- sparseArrayData){ printf("%d\t%d\t%d\n",node.row,node.col,node.value) } //存盘 val path = "D:\\upload\\saveTextTitle.txt" val writer = new PrintWriter(new File(path)) for(node <- sparseArrayData){ val str = node.row +"\t" + node.col + "\t" + node.value //writer.write() writer.println(str) } writer.close() writer.flush() //读盘 println("----------------读取磁盘中信息----------------") val file = Source.fromFile(path) //文件信息转二维数组 val diskSparseArray = new ArrayBuffer[Node]() for(line <- file.getLines) { println(line) val array = line.split("\t") val node = new Node(array(0).toInt,array(1).toInt,array(2).toInt) diskSparseArray.append(node) // 加入到稀疏数组 } file.close() //val chessMap2 = sparseArrayToSourceData(sparseArrayData) val chessMap2 = sparseArrayToSourceData(diskSparseArray) println("----------从稀疏数组恢复的棋盘地图----------") for(item1 <- chessMap2){//行,是一维数组 for(item2 <- item1){//列 printf("%d\t",item2) } println() } } //数组转成稀疏数组 //思路:效果是达到数据的压缩 def arrayToSparsArray(rowSize: Int, colSize: Int, chessMap: Array[Array[Int]]): ArrayBuffer[Node] = { val sparseArray = new ArrayBuffer[Node]() val node = new Node(rowSize, colSize, 0) sparseArray.append(node) for(i <- 0 until chessMap.length){ for( j <- 0 until chessMap(i).length){ //判断该值是否为0,如果不为0就保存 if(chessMap(i)(j) != 0){ //就构建一个Node val node = new Node(i,j,chessMap(i)(j)) sparseArray.append(node) // 加入到稀疏数组 } } } sparseArray } //从稀疏数组中恢复原始数据 def sparseArrayToSourceData(sparseArrayData: ArrayBuffer[Node]): Array[Array[Int]] = { //1、读取稀疏数组的第一个节点 val newNode = sparseArrayData(0) val newRowSize = newNode.row val newColSize = newNode.col val chessMap2 = Array.ofDim[Int](newRowSize,newColSize) //遍历稀疏数组 for(i <- 1 until sparseArrayData.length){ val node = sparseArrayData(i) chessMap2(node.row)(node.col) = node.value } chessMap2 } } class Node(val row: Int, val col: Int, val value: Int) ``` **运行结果** ```basic ----------原始的棋盘地图------------------- 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 ----------输出稀疏数组---------- 11 11 0 1 2 1 2 3 2 ----------------读取磁盘中信息---------------- 11 11 0 1 2 1 2 3 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 ```
标签:
Scala
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/1235.html
上一篇
Scala练习(一)
下一篇
Scala队列练习
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
MySQL
JavaSE
Spark
二叉树
队列
Azkaban
DataX
Spark Core
Jenkins
正则表达式
散列
Jquery
JavaScript
人工智能
VUE
持有对象
Python
微服务
稀疏数组
并发编程
Hadoop
CentOS
RSA加解密
Quartz
MyBatis-Plus
Tomcat
Golang
容器深入研究
JVM
Docker
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞