TP "structures de données"§

Pour commencer (30 min)§

Maven§

Consultez http://maven.apache.org/.

Sur les machines du département§

Maven télécharge automatiquement tous plugins nécessaires pour son propre fonctionnement ou pour le fonctionnement de votre code.

Les fichiers sont stockés par convention sur $HOME/.m2. Pour éviter de surcharger votre répertoire personnel, avant tout, faites un lien symbolique vers /tmp:

Création d'un projet§

Compilation§

Tests§

Configurer les versions de Java, JUnit§

Pour utiliser Java 5 (annotations), dans pom.xml, ajoutez ceci entre les balises project:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.2</version>
      <configuration>
        <source>5</source>
        <target>5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

De plus, pour les tests, corrigez la version de JUnit en 4.2.

Organisation des fichiers§

A partir de maintenant, sauf mention contraire, les classes de l'application appartiendront au package tc.elp.java.datastructures. Leur fichier source d'extension .java sera donc ajouté au répertoire src/main/java/tc/elp/java/datastructures.

Un tableau dynamique (45 min)§

Objectif§

Classe DynamicArray§

diagramme UML de la classe DynamicArray

Détails d'implémentation§

illustration de l'implémentation de la classe DynamicArray

Implémentation de piles (45 min)§

Interface Stack§

Objectif§

Exception§

Classe StackByLinkedList§

Classe StackByArray§

Code client (20 min)§

Hanoi§

L'objectif est maintenant d'implémenter l'algorithme qui déplace les tours de Hanoi; chaque tour étant modélisée par une pile d'entiers.

Bien sûr, vous devez veiller à ce que toute structure de données de pile (respectant l'interface Stack) puisse être utilisé dans votre code.

Ce code sera écrit dans la classe Hanoi, ajoutée au répertoire src/main/java (elle n'appartient pas au package tc.elp.java.datastructures).

Jar (20 min)§

Qu'est-ce que c'est ?§

Un fichier .jar est une archive compressée de classes compilées (fichiers .class)

Cela facilite donc le déploiement et la diffusion d'un projet.

Création d'une archive jar§

Utilisation d'un jar§

Jar exécutable§

NB. L'option e permet de spécifier la classe à exécuter (= entrypoint).

Maven et Jar§

Rendu du travail§

Pour aller plus loin (45 min)§

Généricité§

Nous avons manipulé jusqu'à maintenant des tableaux et piles d'entiers. Mais aucune partie du code n'est spécifique au type int; nous voudrions donc avoir des structures de données dont on peut choisir le type des éléments.

Depuis Java 5, les generics fournissent un mécanisme pour que les classes, interfaces, méthodes puissent être paramétrées par un type; les incohérences étant détectées à la compilation.

Syntaxe§

On fait suivre le nom de la classe (ou interface) par le paramètre de type entre chevrons:

class LinkedListNode<E> { ... }

Dans le code, E représente le type d'un élément:

private E myValue; /// valeur d'un élément

Pour instancier, on donne en argument un type existant:

LinkedListNode<Integer> node = new LinkedListNode<Integer>();

Le mécanisme de substitution est celui du passage de paramètres.

Restriction§

Il n'est pas possible d'avoir un type primitif comme argument:

LinkedListNode<int> node = new LinkedListNode<int>(); //compile pas

En remplacement, on utilise les wrappers Boolean, Character, Integer, Long, Float, and Double qui héritent tous de Object (comme tout type non primitif), et ajoutent des services aux types primitifs (conversion, etc.).

LinkedListNode<Integer> node = new LinkedListNode<Integer>(); //ok

Objectif§

L'objectif de cette partie est de rendre générique l'interface Stack et les classes LinkedListNode, StackByLinkedList (afin d'avoir des piles dont le type d'élément est arbitraire).

En revanche, comme tableaux et generics cohabitent mal, on exige simplement de la classe StackByArray (qui dérive de DynamicArray) qu'elle satisfasse l'interface Stack<Integer>.

Dans les tests et dans Hanoi, on n'utilisera que des instances de classes respectant l'interface Stack<Integer>.

NB. Pour éviter de tout casser, travaillez sur une copie de votre projet.

Rendu du travail§