Le but de cet exercice est d'écrire une implantation de listes chaînées.
Nous allons dans un premier temps créer une liste chaînée d'entiers.
Créer un record Link dans le paquetage fr.uge.data correspondant à un maillon de la liste chaînée stockant des entiers.
En aucun cas, l'utilisateur de la classe ne devra lui-même manipuler des maillons.
Quelle doit être la visibilité du record fr.uge.data.Link ?
Écrire un main de test dans cette classe créant deux maillons contenant les valeurs 13 et 144.
Créer une classe fr.uge.data.LinkedLink qui permettra de manipuler une liste chainée par son premier maillon, avec une méthode add(int value) qui ajoute un élément en tête de la liste.
Pour tester la classe fr.uge.data.LinkedLink, créer une classe Main dans le package fr.uge.data.main.
Écrire une méthode get(index) qui renvoie l'élément à l'index (en commençant à 0).
Comment faire en sorte que code qui vérifie que l'index est valide soit en O(1) ?
Faite les changements qui s'imposent.
Ecrire une méthode forEach(lambda) qui appel la lambda avec la valeur de chaque maillon de la liste.
Ecrire une méthode d'affichage habituelle qui affiche la liste chainée avec des "-->" entre les valeurs.
Avec une liste obtenue en ajoutant 3 puis 2 puis 1, on obtient
1 --> 2 --> 3
Il existe une classe StringJoiner qui prend à la construction un délimiteur et qui va appliquer le délimiteur entre les chaines de caractères ajoutées avec add.
En option : il est possible d'écrire une version avec un stream soit en utilisant la version la 3 paramètres de Stream.iterate() soit si vous êtes vraiment balèze, en utilisant Stream.mapMulti() !
Dans le but de pouvoir réutiliser la liste dans différents codes, changer les classes fr.uge.data.LinkedLink et fr.uge.data.Link pour une implantation plus générique à base d'Object.
Dans la classe Main, expliquer pourquoi le code suivant ne fonctionne pas ?
var l = new LinkedLink(); l.add("hello"); l.add("world"); l.forEach(s -> System.out.println("string " + s + " length " + s.length()));Que doit-on faire pour que le code fonctionne
Le but de cet exercice est de "générifier" les classes fr.uge.data.LinkedLink et fr.uge.data.Link.
Rappeler quel est l'intérêt d'utiliser un type paramétré ici ?
Paramétrer la classe fr.uge.data.LinkedLink pour que celle-ci soit générique.
Modifier la classe fr.uge.data.main.Main en conséquence.
Optionnellement, pour les plus balèzes, écrire une méthode removeIf qui supprime tous les éléments vrais pour un prédicat.
Par exemple, pour supprimer tous les éléments pairs d'une liste
var l = new LinkedLink<Integer>(); l.add(24); l.add(17); l.add(12); l.removeIf(i -> i % 2 == 0); System.out.println(l); // 17Note: on peut utiliser un appel récursif et de recréer une nouvelle liste lors de la remonter.