:: Enseignements :: ESIPE :: E4INFO :: 2014-2015 :: Java Avancé ::
[LOGO]

Exam de Java Avance


Exercice 1 - BinaryTree 1

La classe BinaryTree ci-dessous implantant un arbre binaire de recherche n’est pas finie, on se propose de la terminer.

  1. Avant de commencer, expliquer ce que veut dire static devant la déclaration de la classe BinaryTreeNode.
  2. Ecrire la méthode toString en faisant attention au cas particulier de l'arbre vide.
  3. Ecrire la méthode size qui compte le nombre de valeur à l'intérieur de arbre.
  4. On souhaite écrire une méthode toSet qui renvoie les valeurs stockées dans l'arbre sous forme d'un Set.
    Expliquer pourquoi la méthode renvoie un Set et pas une collection ou une liste.
    Quelle est la signature de la méthode toSet sachant que la méthode doit renvoyer un ensemble d'entier.
    Indiquer le code de la méthode toSet.
  5. On souhaite écrire une méthode forEach qui prend un java.util.function.Consumer en paramètre et appel sa méthode accept pour chaque valeur de l'arbre. Rappel l'interface Consumer est définie comme ceci
          public interface Consumer<T> {
            void accept(T t);
          }
         

    Quelle est la signature de la méthode forEach ?
    Donner l'implantation de la méthode forEach.
  6. On peut remarquer que l'on peut ré-écrire toSet avec forEach. Indiquer le nouveau code de toSet.
  7. De même, on peut ré-écrire la méthode size en utilisant la méthode forEach.
    Indiquer le nouveau code de size.

Exercice 2 - BinaryTree 2

On souhaite générifier la classe BinaryTree, on appelera cette classe GenericBinaryTree

  1. Nous avons besoin d'un ordre de comparaison entre les élements. Rappelez en Java les deux façons de spécifier un ordre de comparaison (qui correspondent aux interfaces java.lang.Comparable et java.util.Comparator).
  2. Pour la suite, on supposera que le constructeur prend en paramètre un java.util.Comparator.
    Indiquer les déclarations de la classe GenericBinaryTree, du constructeur et des méthodes (add, forEach et toSet).
  3. Si vous ne l'avez pas fait à la question précédente, re-vérifier la signature de la méthode forEach(), il y a une une petite astuce.
  4. On souhaite écrire une méthode contains qui permet de savoir si un élement est dans l'arbre.
    Indiquer la signature de la méthode contains.
    Indiquer le code de la méthode contains sachant qu'il n'est pas nécessaire de parcourir toutes les valeurs.
  5. On souhaite maintenant écrire une méthode max.
    Note: il n'est pas nécessaire de regarder tous les éléments.
  6. On veut pouvoir faire des parcours de l’arbre binaire de façon variées. Pour cela, on propose une méthode traverse qui prend trois lambdas. Une qui agit avant la descente récursive, une qui agit entre les deux appels récursifs, et une troisième après les deux.
    Indiquer la signature de la méthode traverse. On supposera que les lamdas de retourne rien.
    Indiquer la code de la méthode traverse.
    Ecrire à titre d'exemple les trois appels qui permettent de faire un affichage préfixe, infixe, suffixe.
  7. On souhaite écrire une méthode iterator() qui renvoie un Iterator.
    Expliquer pourquoi il est nécessaire d'utiliser une pile pour implanter l'itérateur.
    Sachant que la classe java.util.ArrayDeque possède les méthodes classiques push, pop et peek, indiquer le code de la méthode iterator.