IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Construire un arbre


Sujet :

Java

  1. #21
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Bonsoir;

    Je reste toujours avec le problème de construction d'arbre. Je veux maintenant généraliser l'arbre construite précédemment pour contenir n acteurs.

    J'ai par exemple trois acteurs x,y,z; chacun ayant ses choix:
    choixX={36,43,37}
    choixY={44,49,37}
    choixZ={44,49,36,43}
    à condition que les choix effectués par chacun des acteurs sont supprimé des choix des autres. Quand j'obtient les feuilles (les feuilles ici soit la liste des choix de tous les acteurs est vide ou bien si j'arrive au dernier joueur. Si j'arrive au dernier acteur même il reste encore des choix à effectuer par les autres acteurs, je termine et j'obtient une feuille) , je sauvegarde la numération des branches. Comme le montre la figure.
    Voici le code; j'obtient une exception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    private ArrayList<ArrayList<Integer>> newActionList( ArrayList<ArrayList<Integer>> PlayersActions,List<Integer> actionsToDelete) { 
    		 ArrayList<ArrayList<Integer>> NewPlayersActions = (ArrayList<ArrayList<Integer>>) new ArrayList<ArrayList<Integer>>(PlayersActions).clone();
    		for(int k = 0; k < PlayersActions.size(); k++){
    			NewPlayersActions.get(k).removeAll(actionsToDelete);
    		}
    		return NewPlayersActions;
    	}
     
     public TreeNode buildTree( ArrayList<Integer>Players, ArrayList<ArrayList<Integer>> PlayersActions) {
                // on créé une racine pour l'acteur 1
    			DefaultMutableTreeNode racine = createNode(Players.get(0), null); // on créé la racine
    			// on créé les branches et les sous noeuds
    			buildTree(racine,Players,PlayersActions , Trace1, Trace2,  new StringBuilder(), 0);
    			return racine;
    	}
     
    // création des sous-noeuds d'un noeud parent
    	private void buildTree(DefaultMutableTreeNode parent,ArrayList<Integer>Players, ArrayList<ArrayList<Integer>> PlayersActions, Stack<ArrayList<Integer>>Trace1, Stack<ArrayList<Integer>> Trace2, StringBuilder sb, int i) {
    		// actions choisies par chacun des acteurs, au fur et à mesure
    		List<Integer> choixActions1 = new ArrayList<Integer>();
    		for(Integer action1 : PlayersActions.get(i)) {
    			choixActions1.add(action1);
    			Trace1.push((ArrayList<Integer>) choixActions1);
    			// on créé les sous-noeuds
    			// on créé les listes d'actions disponibles sans les choix faits pour cette itération
    			ArrayList<ArrayList<Integer>> NewPlayersActions = newActionList(PlayersActions,choixActions1);
    			StringBuilder sbf = new StringBuilder(sb); 
    			sbf.append(parent.getChildCount()+1); // on ajoute un fils à chaque itération
    	 		if (NewPlayersActions.isEmpty() || i == Players.size()-1) {
    				// on créé une feuille si les 2 listes d'actions sont vides
    	 			parent.add(createLeaf("leaf ", Players.get(i), sbf));
     
    			}
    			else {
    				i++;
    				DefaultMutableTreeNode nodeActeur1 = createNode(Players.get(i), choixActions1);
    				parent.add(nodeActeur1);
    				// appel récursif
    				buildTree(nodeActeur1, Players,NewPlayersActions, Trace2, Trace1, sbf, i);
    				Trace1.pop();
    			}
    		}
    	}
    Merci en avance.
    Images attachées Images attachées  

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est quoi l'exception ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #23
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Voici l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    	at java.util.AbstractList$Itr.next(Unknown Source)
    	at Game.TreeNplayer.buildTree(TreeNplayer.java:83)
    	at Game.TreeNplayer.buildTree(TreeNplayer.java:59)
    	at Game.TreeNplayer.<init>(TreeNplayer.java:17)

  4. #24
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Cette exception signifie que tu modifies une collection (ou une map, ou...), probablement une de tes ArrayList de ArrayList, pendant que tu la parcours, avec un itérateur.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Object value : arrayList) {
       if ( value ... ) {
         arrayList.remove(value); // ou arraylist.add(new ...); d'ailleurs
       }
    }
    cause cette exception. Pour éviter ce genre de problème, soit tu duppliques la liste pour la parcourir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Object value : new ArrayList<>(arrayList)) {
       if ( value ... ) {
         arrayList.remove(value); // ou arraylist.add(new ...); d'ailleurs
       }
    }
    soit, pour le remove uniquement, tu utilises un Iterator, et la méthode remove() de l'Iterator, soit encore tu crées une liste intermédiaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<...> toDelete = new ArrayList<>();
     for(Object value : arrayList) {
       if ( value ... ) {
         toDelete.add(value);
       }
    }
    arrayList.removeAll(toDelete); // ou arrayList.addAll(toAdd); pour ajouter

    Un petit conseil, en passant : à un moment donné, utiliser des List de List de List de truc devient assez difficile à lire, donc à comprendre, donc à faire fonctionner... Il n'est pas interdit de faire des classes en java Faire des classes te permettra de "découper" ton algo complexe en sous-parties élémentaires plus simples, isolées des autres.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #25
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Merci

    J'ai réglé l'exception. Mais le résultat obtenu dans l'affichage est erroné, c'est pas celle voulue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    \    
    [(0)]
    \         \             \                  
    [(1-[36]), (2-[36, 43]), (leaf Player:2(3)]
    \         \                   \                   \                   \                   
    [(2-[44]), (leaf Player:2(12), (leaf Player:2(13), (leaf Player:2(21), (leaf Player:2(22)]
    \                    \                    
    [(leaf Player:2(111), (leaf Player:2(112)]
    j'ai remarqué que mon algorithme ignore le deuxième acteur, il prend qu ele premier et le dernier.
    Le résultat voulu est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    \    
    [(0)]
    \         \             \                  
    [(1-[36]), (1-[36, 43]), (1-[36,43,47])]
    \         \                   \                   \                   \                   
    [(2-[44]), (2-[44,49]), (2-[44,49,37]),(2-[44]), (leaf Player:2(22)), (leaf Player:2(23)), (2-[44]), (leaf Player:2(32)), (leaf Player:2(33))]
    \                    \                    
    [(leaf Player:2(111), (leaf Player:2(112),(leaf Player:2(121),(leaf Player:2(131),(leaf Player:2(211),(leaf Player:2(311)]
    Merci en avance.

Discussions similaires

  1. [C#] Structure arborescente. Construire un arbre d'Object.
    Par PerpetualSnow dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/08/2006, 13h57
  2. Construire un "arbre des différences" ?
    Par progfou dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 18/05/2006, 15h59
  3. [Arbre] Construire un arbre
    Par ludovic.fernandez dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 16/05/2006, 13h40
  4. construire un arbre
    Par iamhere dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/03/2006, 17h01
  5. construire un arbre n-aire
    Par emidelphi77 dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo