Série 3 – Jeu de Jass : corrigé
Introduction
Le code du corrigé est disponible sous la forme d'une archive Zip. Les solutions aux différents exercices sont brièvement discutées ci-dessous.
Exercice 1
La classe Card
ne présente pas de difficulté particulière, et la quasi-totalité de son code devrait être compréhensible facilement. Seule la méthode compareTo
mérite peut-être une courte explication.
Pour mémoire, compareTo
doit ordonner les cartes d'abord par couleur puis par valeur. Elle commence donc par comparer la couleur des deux cartes au moyen de la méthode compareTo
de l'énumération Suit
. Si la couleur des deux cartes diffère, elle retourne le résultat de cette comparaison comme résultat de la comparaison des deux cartes. Sinon, il lui faut comparer les cartes par valeur, ce qu'elle fait naturellement au moyen de la méthode compareTo
de l'énumération Rank
.
@Override public int compareTo(Card that) { int suitC = suit.compareTo(that.suit); return suitC != 0 ? suitC : rank.compareTo(that.rank); }
Exercice 2
La classe JassGame
ne présente pas de difficulté particulière.
Exercice 3
La classe JassGameUse
utilise les classes développées dans les exercices précédents de manière relativement simple. Pour afficher les mains des joueurs dans l'ordre trié, elle définit — comme proposé dans l'énoncé — une méthode sortedIterator
qui, étant donné un itérateur sur des valeurs comparables, produit un itérateur sur ces mêmes valeurs mais triées selon leur ordre naturel.
Pour ce faire, la méthode sortedIterator
se contente de créer une liste intermédiaire de type ArrayList
— mise en œuvre idéale lorsqu'on désire trier les éléments — d'y placer la totalité des éléments de l'itérateur, de la trier et enfin de retourner un itérateur sur ses éléments.
public static <E extends Comparable<E>> Iterator<E> sortedIterator(Iterator<E> baseIterator) { List<E> iteratorElements = new ArrayList<>(); while (baseIterator.hasNext()) iteratorElements.add(baseIterator.next()); Collections.sort(iteratorElements); return Collections.unmodifiableList(iteratorElements) .iterator(); }
Notez que la liste triée est rendue non modifiable afin que la méthode remove
de l'itérateur lève l'exception UnsupportedOperationException
. Cela est judicieux, car sinon l'appelant pourrait utiliser cette méthode remove
pour supprimer un élément de la liste triée, mais cette suppression ne serait pas répercutée dans la liste initiale, ce qui serait surprenant. Pour éviter cette surprise, il semble préférable d'interdire toute modification.