Voilà je voudrais me coder une classe nommée "GraphMap". Bon j'ai commencé à faire tout ça mais je finis par être bloqué vis à vis de ma conception par rapport aux services que je veux qu'offre cette classe.
Bon tout de suite pour être clair, je cherche ni plus ni moins à me coder une classe qui représente des graphes. Au passage je trouve cela bizarre que la librairie standard de Java ne propose pas cette structure de donnée.
J'ai decidé de partir dans un 1er temps sur une réprésentation basée sur un mappage clé/valeur dans un graphe orienté
Par conséquent, j'ai choisi d'utiliser la structure directement sous jacente un TreeMap.
En gros, la clé du TreeMap est le noeud source; la valeur serait un autre TreeMap (appelons le TreeMap2). Cela veut dire que chaque noeud du TreeMap contiennent un TreeMap2 comme valeur. Ce TreeMap2 a pour clé le noeud destination et pour valeur la donnée utilisateur associée a la relation (qu'on peut assimiler au poids de l'arc).
Bref, après ces présentations, je rentre dans le vif du sujet : je souhaiterais effectuer les opérations suivantes :
- Renvoyer tous les noeuds N dont le noeud n est le noeud source (et donc N les noeuds destinations). Un prototype de fonction adapté serait :
Set<K> keySet (K key, boolean isLeftKey);
avec
@key : une clé
@isLeftKey : si true, spécifie que key est la clé source (cad a gauche dans un couple de relation)
si false, spécifie que key est la clé destination (cad a droite dans un couple de relation)
@La fonction renverrait le Set de clé : ou bien toutes celles de droite dans le couple (si isLeftKey == true), ou bien toutes celles de gauche dans le couple (si isLeftKey == false)
Bon supposons que dans un appel a keySet, isLeftKey vaut true; pour mener a bien cette fonction, vous allez me dire rien de plus fastoche : un petit appel a la fonction keySet sur le TreeMap2 venant du noeud source key !...et vous avez raison !
Le problème commence si isLeftKey vaut false. Admettons que je parcours tout l'arbre(=TreeMap) pour regarder dans chacun des sous arbres (=TreeMap2) si key est présent ; (et si oui, je rajoute la clé de TreeMap dans un set ; sinon non)
Cela m'amène à la question:
Comment faire pour que le set renvoyé soit "synchronisé" avec le graph ? (de la même façon que la fonction keySet () dans TreeMap le fait!) cad que la suppression par l'utilisateur d'un element dans le set supprime automatiquement cet element dans le graphe et vice-versa.
La classe TreeMap a dc cette fonction keySet () synchronisée sur l'arbre. Et pourtant, l'interface Set n'est jamais implemente par cette classe (et par ses super classes). J'imagine que pour renvoyer un Set, ils copient tous les noeuds dans un TreeSet par exemple, mais celui-ci comment serait synchronisé sur le TreeMap de départ ?
Dans un main quand je fais :
Code :
- TreeMap tree = new TreeMap ();
- Set set = tree.keySet ();
- System.out.println ("class : " + set.getClass().getName());
|
la sortie est :
class : java.util.TreeMap$1 ... or TreeMap n'implemente jamais l'interface Set ! donc le set ne peut venir d'un TreeMap. En plus dans la librairie ils distinguent bien les classes de mappage (clé/valeur) des classes d'ensemble (o๠la valeur est a la fois la clé). Comment cela se fait-il ?