加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数据结构 – 如何从scala中的文件中读取不可变数据结构

发布时间:2020-12-16 09:56:14 所属栏目:安全 来源:网络整理
导读:我有一个由Jobs组成的数据结构,每个都包含一组Tasks.作业和任务数据都在以下文件中定义: jobs.txt:JAJBJCtasks.txt:JB T2JA T1JC T1JA T3JA T2JB T1 创建对象的过程如下: – 阅读每个作业,创建它并通过id存储它 – 读取任务,按ID检索作业,创建任务,在作业
我有一个由Jobs组成的数据结构,每个都包含一组Tasks.作业和任务数据都在以下文件中定义:

jobs.txt:
JA
JB
JC

tasks.txt:
JB  T2
JA  T1
JC  T1
JA  T3
JA  T2
JB  T1

创建对象的过程如下:
– 阅读每个作业,创建它并通过id存储它
– 读取任务,按ID检索作业,创建任务,在作业中存储任务

读取文件后,永远不会修改此数据结构.所以我希望作业中的任务存储在一个不可变的集合中.但我不知道如何以有效的方式做到这一点. (注意:存储作业的不可变映射可能不可变)

这是代码的简化版本:

class Task(val id: String) 

class Job(val id: String) {
    val tasks = collection.mutable.Set[Task]() // This sholud be immutable
}

val jobs = collection.mutable.Map[String,Job]() // This is ok to be mutable

// read jobs
for (line <- io.Source.fromFile("jobs.txt").getLines) { 
    val job = new Job(line.trim)
    jobs += (job.id -> job)
}

// read tasks
for (line <- io.Source.fromFile("tasks.txt").getLines) {
    val tokens = line.split("t")
    val job = jobs(tokens(0).trim)
    val task = new Task(job.id + "." + tokens(1).trim)
    job.tasks += task
}

提前感谢您的每一个建议!

解决方法

执行此操作的最有效方法是将所有内容读入可变结构,然后在最后转换为不可变结构,但这可能需要对具有大量字段的类进行大量冗余编码.因此,请考虑使用底层集合使用的相同模式:具有新任务的作业是一项新工作.

这是一个甚至懒得阅读作业列表的例子 – 它从任务列表中推断出来. (这是一个在2.7.x下运行的示例; 2.8的最新版本使用“Source.fromPath”而不是“Source.fromFile”.)

object Example {
  class Task(val id: String) {
    override def toString = id
  }

  class Job(val id: String,val tasks: Set[Task]) {
    def this(id0: String,old: Option[Job],taskID: String) = {
      this(id0,old.getOrElse(EmptyJob).tasks + new Task(taskID))
    }
    override def toString = id+" does "+tasks.toString
  }
  object EmptyJob extends Job("",Set.empty[Task]) { }

  def read(fname: String):Map[String,Job] = {
    val map = new scala.collection.mutable.HashMap[String,Job]()
    scala.io.Source.fromFile(fname).getLines.foreach(line => {
      line.split("t") match {
        case Array(j,t) => {
          val jobID = j.trim
          val taskID = t.trim
          map += (jobID -> new Job(jobID,map.get(jobID),taskID))
        }
        case _ => /* Handle error? */
      }
    })
    new scala.collection.immutable.HashMap() ++ map
  }
}

scala> Example.read("tasks.txt")
res0: Map[String,Example.Job] = Map(JA -> JA does Set(T1,T3,T2),JB -> JB does Set(T2,T1),JC -> JC does Set(T1))

另一种方法是读取作业列表(创建作业作为新作业(jobID,Set.empty [Task])),然后处理任务列表包含不在作业列表中的条目的错误条件. (每次阅读新任务时,您仍需要更新作业列表地图.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读