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.