gpt4 book ai didi

data-structures - 如何从Scala中的文件读取不可变数据结构

转载 作者:行者123 更新时间:2023-12-04 18:16:38 24 4
gpt4 key购买 nike

我有一个由Jobs构成的数据结构,每个结构包含一组Tasks。 Job和Task数据都在以下文件中定义:

jobs.txt:
JA
JB
JC

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

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

读取文件后,就永远不会修改此数据结构。因此,我希望作业中的任务将存储在一个不可变的集合中。但是我不知道如何有效地做到这一点。 (注意:不可变的 map 存储作业可能保持不变)

这是代码的简化版本:
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))

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

关于data-structures - 如何从Scala中的文件读取不可变数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com