J'ai une structure de données faite de Jobs contenant chacun un ensemble de tâches. Les deux données de travail et tâches sont définies dans des fichiers comme ceux-ci:comment lire des structures de données immuables à partir d'un fichier dans scala
jobs.txt:
JA
JB
JC
tasks.txt:
JB T2
JA T1
JC T1
JA T3
JA T2
JB T1
Le processus de création d'objets est la suivante:
- lire chaque tâche, créez et stocker par id
- tâche de lecture, récupérer travail par id, créer une tâche, stocker une tâche dans le job
Une fois les fichiers lus, cette structure de données n'est jamais modifiée. Donc, je voudrais que les tâches dans les emplois seraient stockés dans un ensemble immuable. Mais je ne sais pas comment le faire de manière efficace. (Note: la carte immuable stockage des emplois peut être laissé immuable)
Voici une version simplifiée du code:
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
}
Merci d'avance pour toute suggestion!
J'aime cette approche. Mais je voudrais juste écrire une méthode 'addTask' qui retourne un nouveau' Job' avec les mêmes données, plus la nouvelle tâche. Cela changerait un peu la logique, mais, comme c'est le cas, Job semble trop savoir comment il va être initialisé. :-) –
Je l'ai fait de cette façon pour mettre en évidence le remplacement de l'ancien travail par un nouveau, qui m'a semblé être le concept clé ici. Mais je suis d'accord qu'un 'addTask' quelque part serait mieux. Il y a beaucoup d'endroits pour lesquels on pourrait argumenter (devrait-il prendre un 'Option [Job]', ou être une fermeture autour de la carte mutable?). –
Merci, j'aime cette solution pour l'idée du Job qui crée le nouveau Job (par constructeur ou par addTask). Je suis encore très jeune à scala (je viens de java) et je ne suis pas encore sûr si, dans un cas comme celui-ci, l'immutabilité vaut le coût d'avoir beaucoup de création d'objet puisque pour moi la performance est assez importante le cas réel j'ai plus les 2 classes, avec des liens complexes entre eux et des milliers d'objets). –