Tu travailles sur un projet de développement d'un système de planification des trains pour un réseau ferroviaire très fréquenté.
On t'a demandé de développer un prototype pour les itinéraires de train du système de planification. Chaque itinéraire est constitué d'une suite de gares où s'arrête un train donné.
Ton équipe a décidé d'utiliser une liste doublement chaînée pour représenter chaque ligne de train de l'horaire. Chaque gare le long de la ligne de train sera représentée par un nœud dans la liste chaînée.
Pas besoin de te soucier des heures d'arrivée et de départ dans les gares. Chaque gare sera simplement représentée par un nombre.
Les lignes peuvent être prolongées, en ajoutant des gares au début ou à la fin d'une ligne. Elles peuvent aussi être raccourcies en supprimant des gares au début ou à la fin d'une ligne.
Il arrive qu'une gare ferme, et dans ce cas elle doit être retirée de la ligne, même si elle ne se trouve ni au début ni à la fin de celle-ci.
La taille d'une ligne ne se mesure pas à la distance parcourue par le train, mais au nombre de gares où il s'arrête.
La liste chaînée est une structure de données fondamentale en informatique, souvent utilisée pour implémenter d'autres structures de données. Comme son nom l'indique, c'est une liste de nœuds reliés entre eux. C'est une liste de « nœuds », où chaque nœud est relié à son ou ses voisins. Dans une liste simplement chaînée, chaque nœud n'est relié qu'au nœud qui le suit. Dans une liste doublement chaînée, chaque nœud est relié à la fois au nœud qui le précède et à celui qui le suit.
Si tu veux approfondir les listes chaînées, jette un œil à cet article qui les explique avec de jolis dessins.
Cet exercice introduit les génériques.
Pour que les tests passent, tu dois construire ta classe de façon qu'elle accepte n'importe quel type d'entrée, par exemple Integer ou String.
Les génériques sont utiles parce qu'ils permettent d'écrire du code plus général et plus réutilisable.
En Java, les implémentations de List et de Map sont deux exemples de classes qui utilisent les génériques.
Grâce à eux, tu peux construire une List contenant des Integers, ou une List contenant des Strings, ou n'importe quel autre type.
Les types utilisés avec les génériques sont soumis à quelques contraintes.
L'une d'elles est qu'une fois que tu as construit une List contenant des Integers, tu ne peux plus y mettre des Strings.
Tu dois préciser le type que tu veux mettre dans la classe au moment de la construire, et cette instance ne pourra ensuite être utilisée qu'avec ce type.
Par exemple, tu pourrais construire une liste d'Integers :
List<Integer> someList = new LinkedList<>();
Maintenant, someList ne peut contenir que des Integers. Tu peux aussi faire :
List<String> someOtherList = new LinkedList<>()
Maintenant, someOtherList ne peut contenir que des Strings.
Une autre contrainte est qu'aucun type utilisé avec les génériques ne peut être un type primitif, comme int ou long.
Cependant, chaque type primitif a un type de référence correspondant : au lieu de int, tu peux donc utiliser Integer, et au lieu de long, Long.
Pour te lancer, il peut être utile de regarder un exemple d'utilisation des génériques.
Inscris-toi sur Exercism pour apprendre et maîtriser Java avec 26 concepts158 exercices, et un vrai mentorat humain, le tout gratuitement.