我有一個由作業組成的數據結構,每個數據結構都包含一組任務。無論工作和任務數據在文件中定義這樣的:如何從scala中的文件讀取不可變數據結構
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
}
預先感謝每一個建議!這裏
我喜歡這種方法。但是我只寫了一個'addTask'方法,它返回一個新的'Job'和相同的數據,再加上新的任務。它會稍微改變邏輯,但是,就像這樣,'Job'似乎對如何初始化太多瞭解太多。 :-) –
我這樣做是爲了突出舊工作的替代,這在我看來是這裏的關鍵概念。但我同意某個地方的addTask會更好。有很多地方可以爭論(應該採用'Option [Job]',還是圍繞可變映射關閉?)。 –
謝謝,我喜歡這個創建新Job的Job的想法的解決方案(通過構造函數或addTask方法)。我仍然對scala很陌生(我來自java),但我不確定在這種情況下,不變性是否值得創建許多對象,因爲對我而言,性能非常重要(在真正的情況下,我有更多的2類,與他們和上千個對象之間的複雜鏈接)。 –