Ho una struttura dati composta da lavori ciascuno contenente un insieme di attività. Sia i dati di lavoro e di attività vengono definite in file come questi:come leggere le strutture di dati immutabili dal file in scala
jobs.txt:
JA
JB
JC
tasks.txt:
JB T2
JA T1
JC T1
JA T3
JA T2
JB T1
Il processo di creazione degli oggetti è la seguente:
- leggere ogni lavoro, creare e conservarla per ID
- leggere compito, recuperare lavoro per id, creare attività, memorizzare attività nel lavoro
Una volta letti i file, questa struttura dati non viene mai modificata. Quindi vorrei che le attività all'interno dei lavori fossero archiviate in un set immutabile. Ma non so come farlo in modo efficiente. (Nota: la mappa immutabile memorizzazione di posti di lavoro può essere lasciato immutabile)
Ecco una versione semplificata del codice:
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
}
Grazie in anticipo per ogni suggerimento!
Mi piace questo approccio. Ma scriverei semplicemente un metodo 'addTask' che restituisce un nuovo' Lavoro' con gli stessi dati, oltre alla nuova attività. Cambierà un po 'la logica, ma, come è ovvio, 'Job' sembra sapere troppo su come sarà inizializzato. :-) –
L'ho fatto in questo modo per evidenziare la sostituzione del vecchio lavoro con uno nuovo, che mi sembrava il concetto chiave qui. Ma sono d'accordo che un 'addTask' da qualche parte sarebbe meglio. Ci sono molti posti in cui si potrebbe obiettare (dovrebbe prendere un 'Opzione [Lavoro]', o essere una chiusura attorno alla mappa mutevole?). –
Grazie, mi piace questa soluzione per l'idea del lavoro che crea il nuovo lavoro (per costruttore o metodo addTask). Sono ancora molto nuovo a scala (vengo da java) e non sono ancora sicuro se, in un caso come questo, l'immutabilità valga il costo di avere molti oggetti creati poiché per me le prestazioni sono abbastanza importanti (in nel caso reale ho più le 2 classi, con collegamenti complessi tra loro e migliaia di oggetti). –