数据结构 – 如何从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 创建对象的过程如下: 读取文件后,永远不会修改此数据结构.所以我希望作业中的任务存储在一个不可变的集合中.但我不知道如何以有效的方式做到这一点. (注意:存储作业的不可变映射可能不可变) 这是代码的简化版本: 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])),然后处理任务列表包含不在作业列表中的条目的错误条件. (每次阅读新任务时,您仍需要更新作业列表地图.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |