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

avec Java Discussion :

trier une liste chaîné simple


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut trier une liste chaîné simple
    Bonjour,

    je cherche à créer trié par ordre croissant une liste chaîné simple mais lorsque j’exécute mon code rien ne se passe mais mon code est toujours exécuté, j'imagine qu'il tourne fou mais je n'arrive pas à comprendre. pour cette exercice j'ai décidé de ne pas utilisé les outils comme ArrayList,etc...

    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
    	public static Fibo2 triV2(Fibo2 tete) {
    		Fibo2 courant = tete,  suivant = courant.jePointeVers, i = tete;
     
     
    		while(courant.jePointeVers !=null) {
     
    			if(suivant.data < courant.data) {
     
    				courant.jePointeVers = suivant.jePointeVers;
    				suivant.jePointeVers = courant;
    				tete = suivant;
    			}
    		//	i.jePointeVers=tete;
    		}
     
     
     
    		return tete;
     
    	}

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonjour,
    Pour être honnête, j'ai un peu de mal à comprendre ce que vous voulez faire, mais ce n'est pas le but, et cela ne m'empêche pas de répondre à votre question.
    Lorsque l'on utilise les boucles While, il faut être très vigilant, et vous en payez le prix, car à la moindre erreur, on obtient rapidement une boucle infinie qui ne fait rien, et donc un code figé qui n'évolue plus, bref, une appli plantée.
    Ici, votre boucle While traite une condition de non nullité sur courant.jepointevers. comme il n'y a aucune "échappatoire" dans le code exécuté par ce While, il est impératif qu'à un moment donné, courant.jepointevers devienne nul, sinon, le While tournera en boucle. Ce qui semble être le cas.
    Alors la question à se poser c'est : Pourquoi courant.jepointevers ne devient jamais nul ?
    Si on examine votre code, celui qui est exécuté dans le While, il est conditionné par le fait que suivant.data soit impérativement inférieur à courant.data, et si ce n'est pas le cas, alors on ne fait strictement rien ?!
    Du coup, lorsque ce n'est pas le cas, ce qui semble se produire, comme on ne fait rien, il n'y a aucune raison que courant.jepointevers devienne nul, et comme rien ne change, la condition de traitement ne sera toujours pas remplie lors de l'occurrence suivante, et nous voilà dans une belle boucle infinie qui ne fait rien...
    La réponse à la première question : Pourquoi courant.jepointevers ne devient jamais nul ?
    est : Parce que suivant.data n'est pas forcément inférieur à courant.data.
    Comment y remédier, deux solutions :
    Soit vous désirez ne traiter que le cas où suivant.data est inférieur à courant.data, il vous suffit alors d'ajouter à votre code la clause Else tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(suivant.data < courant.data) {
       courant.jePointeVers = suivant.jePointeVers;
       suivant.jePointeVers = courant;
       tete = suivant;
       }
    else courant.jepointevers = null;
    Si par contre vous voulez traiter tous les cas de figure, alors il faut faire quelque chose lorsque suivant.data est égale à courant.data, et quelque chose lorsque suivant.data est supérieur à courant.data.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    ce que je souhaite faire avec ce code c'est pouvoir trier de manière croissante une liste avec des données aléatoire.

    j'ai essayé la solution du else mais aucun changement, ma boucle tourne en continu

    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
    public static Fibo2 triV2(Fibo2 tete) {
    		Fibo2 courant = tete, suivant = courant.jePointeVers;
     
     
     
    		while(courant.jePointeVers !=null) {
     
    			if(suivant.data < courant.data) {
     
    				courant.jePointeVers = suivant.jePointeVers;
    				suivant.jePointeVers = courant;
    				tete = suivant;
    			}
    			else {
    				courant.jePointeVers = null;
     
    			}
     
    		}
     
     
    		return tete;
     
    	}

  4. #4
    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
    Salut,

    Ce serait utile d'avoir le modèle (la classe Fibo2) pour comprendre ce que tu fais et évaluer ce que tu voudrais faire.

    Ensuite, au sujet de la remarque de Yotta, sur la condition du while : ce qui est important c'est que la condition soit fausse à un moment donné. Donc que, comme dit, courant.jePointeVers puisse être null. Mais courant.jePointeVers peut être null en le forçant à null, mais aussi si courant change et que sa valeur est justement un "Fibo2" qui a jePointeVers à null. Or, dans le cadre du parcours d'une liste chaînée, il semblerait logique que courant varie (et suivant donc), sinon on ne traite qu'un nœud (le premier à priori), et, donc, il y a peu de chances que ça trie l'ensemble des nœuds de la liste.

    A noter que, dans ton code,
    ça n'a de sens que si courant est la tête, sinon, tu perds forcément le début de ta liste (la tête devient le suivant du courant), si tu fais effectivement varier courant (et suivant).

    Ensuite, il y a le principe du tri. Ici, semble-t-il, tu tentes une approche par un algorithme "tri à bulles", donc parcourt, comparaison 2 à 2 et échange. Mais ce type de tri nécessite de parcourir la liste (entièrement, parce que le dernier élément est peut-être bien le plus petit). Et de le faire tant qu'elle n'est pas triée (sauf cas exceptionnel, on ne peut pas trier en une seule passe, par exemple, 4,3,2,1 va donner 3,2,1,4 à la première passe). Donc au moins d'avoir un booléen qui dit qu'on a fait au moins un échange. Sinon, pouvoir déterminer jusqu'à quel élément il faut faire le parcourt, et quand cet élément est le premier, on sait qu'on peut arrêter. Avec une liste à accès direct, par index, c'est plutôt simple à gérer : on sait que le dernier des éléments à traiter est forcément le plus grand (pour un tri croisant), on décrémente donc le nombre d'éléments à parcourir. Mais pour une liste chaînée, c'est déjà un peu plus complexe.

    Je tenterais plutôt une approche par insertion sur une liste chaînée, qui me semble plus simple : pour chaque élément, on le sort de la liste, on cherche sa position (parcourt + comparaison) dans la liste et on l'insère à cette position. Avec une seule liste, on risque de traiter plusieurs fois un élément déjà traité, mais en utilisant deux listes, sans toucher à la liste à trier et en construisant directement une nouvelle liste triée, c'est assez facile à implémenter pour une version de base sans optimisation ou parallélisme. Pour te simplifier le traitement, commence par écrire celle qui créé la liste triée, donc une méthode qui insert un élément (avant ou après, ça je te laisse y réfléchir, à ce qui est le plus adapté au tri croissant) le premier élément de la liste qui est (plus grand ou plus petit, ça aussi je te laisse réfléchir) que celui que tu cherches à insérer (si la liste est vide, qui insert simplement au début dans tous les cas). Ensuite, tu n'as plus qu'à parcourir tous les éléments de ta liste à trier et d'appeler pour chaque la méthode en question.

    Si tu dois absolument mettre en place un tri à bulle, commence par découper chaque sous-fonction : une fonction qui échange 2 éléments, une fonction qui parcourt une liste, etc. Les assembler me semble plus simple que de vouloir écrire tout l'algorithme d'une traite.
    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. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    @joel.drigo
    voila ma classe Fibo2,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package fibo2;
     
    public class Fibo2 {
     
    	public int data;
    	public Fibo2 jePointeVers;
     
    }

  6. #6
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonjour,
    Je ne sais pas d'où sort votre astuce mais elle est surprenante de simplicité en fait !
    Bref, je n'ai toujours pas compris l'objectif réel de cette méthode, pour autant, j'ai élaboré un résultat fonctionnel en modifiant très peu de chose et en partant de l'hypothèse que l'objectif de cette méthode est d'extraire l'élément le plus petit d'un ensemble d'objet Fibo2 se pointant l'un vers l'autre.
    Mon code de test crée trois instances de l'objet Fibo2, toto1, toto2 et toto3. toto1 pointe vers toto2, toto2 pointe vers toto3 et toto3 pointe vers null. Pour tester la méthode, j'ai exécuté le code en modifiant les valeurs de la propriété data de mes toto pour vérifier tous les cas de figure d'infériorité, d'égalité et de supériorité. Pour pouvoir visualiser le plus simplement possible le comportement de la méthode j'ai quelque peu modifié la classe Fibo2 en lui ajoutant deux propriétés, un boolean nommé 'egalite' et une String nommée 'nom'. Le boolean egalite est mis à faux par défaut et ne passe à vrai pour un Fibo2 que pour signaler qu'il est égale au Fibo2 qui pointe vers lui.
    Voilà ce que cela donne.

    Fibo2 modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Fibo2 {
        public int data;
        public Fibo2 jePointeVers;
        public boolean egalite = false;    
        public String nom;
        }
    Méthode triV2 :

    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
    public Fibo2 triV2(Fibo2 tete) {
    		Fibo2 courant = tete,  suivant = courant.jePointeVers;
                    int i = 0;
    		while(courant.jePointeVers !=null) {
                        if (suivant.data < courant.data) i = 1; // Cas 1 : suivant < courant
                        if (suivant.data == courant.data) i = 2; // Cas 2 : suivant = courant
                        if (suivant.data > courant.data) i = 3; // Cas 3 : suivant > courant
                        switch (i) {
     
                            case 0:
                                break;
     
                            case 1:
                                courant = suivant;
                                suivant = suivant.jePointeVers;
                                tete = courant;
                                break;
     
                            case 2:
                                suivant.egalite = true; // Signifie que ce Fibo2 est égale à celui qui pointe vers lui.
                                courant = suivant;
                                suivant = suivant.jePointeVers;
                                tete = courant;
                                break;
     
                            case 3:
                                tete = courant;
                                courant = suivant;
                                suivant = courant.jePointeVers;
                                break;
                            }
    		}
     
     
     
    		return tete;
     
    	}
    Et le code de l'application de test :

    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
        public static void main(String[] args) {
            Fibo2 toto1 = new Fibo2();
            toto1.data = 3;
            toto1.nom = "toto1";
            Fibo2 toto2 = new Fibo2();
            toto2.data = 2;
            toto2.nom = "toto2";
            toto1.jePointeVers = toto2;
            Fibo2 toto3 = new Fibo2();
            toto3.data = 2;
            toto3.nom = "toto3";
            toto2.jePointeVers = toto3;
            Fibo2 reponse;
            reponse = Main.triV2(toto1); // Appel de votre méthode
            System.out.println("Valeur renvoyée = " + reponse.nom + ", état de l'égalité : " + reponse.egalite);
            }
    Comme vous le voyez, il suffit de jouer avec les totox.data = y pour examiner comment se comporte la méthode ainsi réécrite.
    J'espère que cela vous permettra d'avancer dans votre élaboration.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  7. #7
    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
    Citation Envoyé par yotta Voir le message
    Bref, je n'ai toujours pas compris l'objectif réel de cette méthode, pour autant, j'ai élaboré un résultat fonctionnel en modifiant très peu de chose et en partant de l'hypothèse que l'objectif de cette méthode est d'extraire l'élément le plus petit d'un ensemble d'objet Fibo2 se pointant l'un vers l'autre.
    L'objectif est clairement indiqué dans la question d'origine : trier une liste chaînée par ordre croissant ! Et la classe Fibo2 n'a pas a être modifiée pour ça.

    Y'a pas a tortiller, je l'ai dit, pour le tri à bulle, il faut parcourir les éléments de la liste, les comparer avec leur suivant, les échanger le cas échéant (si l'un deux est plus grand que son suivant, l'ordre n'est manifestement pas correct). Les échanger veut dire modifier des pointeurs. Et faire le parcours autant de fois que nécessaire (donc tant que la liste n'est pas triée).

    Voilà en code/canevas ce que ça peut donner pour le tri à bulle, avec des trous pour ne pas tout écrire non plus (et quelques méthodes pour appuyer l'exemple) :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    	/**
             * Créer un node suivant le node passé en argument avec la valeur spécifiée et retourne le nouveau node
             * @param node
             * @param value
             * @return
             */
    	public static Fibo2 setValue(Fibo2 node, int value) {
    		if ( node==null ) {
    			node = new Fibo2();
    			node.data=value;
    			return node;
    		}
    		else {
    			node.jePointeVers = new Fibo2();
    			node.jePointeVers.data=value;
    			return node.jePointeVers;
    		}
    	}
     
    	/**
             * Créer une liste chainée avec les valeurs passées en argument
             * @param values
             * @return
             */
    	public static Fibo2 enchaine(int...values) {
    		if ( values.length==0 ) return null;
    		Fibo2 tete = null;
    		Fibo2 courant = null;
    		for(int value : values) {
    			courant = setValue(courant, value);
    			if ( tete==null ) { // on mémorise la tête si on ne la connait pas déjà
    				tete = courant;
    			}
    		}
    		return tete;
    	}
     
    	/**
             * Exemple de parcours pour obtenir le dernier élément (celui qui n'a pas de suivant)
             * 
             * @param node
             * @return
             */
    	public static Fibo2 dernier(Fibo2 node) {
    		if ( node==null ) {
    			return null;
    		}
    		else {
    			while(node.jePointeVers!=null) {
    				node=node.jePointeVers;
    			}
    			return node;
    		}
    	}
     
    	/**
             * Exemple de parcours pour obtenir l'élément précédent un node
             * 
             * @param tete tete de liste
             * @param node node dont on veut le précédent
             * @return
             */
    	public static Fibo2 precedent(Fibo2 tete, Fibo2 node) {
    		while(tete!=null && tete.jePointeVers!=node) {
    			tete=tete.jePointeVers;
    		}
    		return tete;
    	}
     
    	/**
             * Echange deux nodes dans une liste
             * 
             * @param tete
             * @param node1
             * @param node2
             * @return
             */
    	public static Fibo2 echanger(Fibo2 tete, Fibo2 node1, Fibo2 node2) {
    		if ( node1==tete ) {
    			tete = node2;
    		}
    		else {
    			Fibo2 precedent = precedent(tete, node1); 
    			if ( precedent!=null ) {
    				precedent.jePointeVers=node2;
    			}
    		}
    		node1.jePointeVers = node2.jePointeVers;
    		node2.jePointeVers = node1;
    		return tete;
    	}
     
    	/**
             * Exemple de parcours pour afficher les éléments à la mode val1->val2->val3->val4
             * @param node
             */
    	public static void affiche(Fibo2 node) {
    		if ( node!=null ) {
    			for(Fibo2 courant=node;courant!=null;courant=courant.jePointeVers) {
    				if ( courant!=node ) {
    					System.out.print("->");
    				}
    				System.out.print(courant.data);
    			}
    			System.out.println();
    		}
    		else {
    			System.out.println("vide");
    		}
    	} 
     
    	/**
             * La méthode qui trie la liste dans l'ordre croissant
             * 
             * @param tete tete de la liste à trier
             * @return tete de la liste triée (nouvelle tête)
             */
    	public static Fibo2 triCroissant(Fibo2 tete) {
    		if ( tete!=null ) {
    			boolean echange; // nécessaire pour savoir si on a fait un échange lors d'un parcours et donc savoir s'arrête 
    			do { 
    				echange = false;
    				Fibo2 precedent = null; // nécessaire pour échanger deux nodes, courant et suivant : precedent->courant->suivant->lasuite va devenir precedent->suivant->courant->lasuivte
    				// on parcourt la liste, de la tete à l'avant dernier (celui qui n'a pas de suivant)
    				for(Fibo2 courant=tete, suivant = courant.jePointeVers; suivant!=null; courant=courant.jePointeVers, suivant=courant.jePointeVers) {
    					/* à remplir (en utilisant la méthode echanger() */
    				} 
    			} while(echange); // si on a pas échangé, alors plus la peine de continuer, la liste est triée
    			return tete; // on retourne la tête
    		}
    		else {
    			return null;
    		}
    	}
     
    	public static void main(String[] args) {
    		//Fibo2 list = enchaine(9,3,7,1,4);
    		Fibo2 list = enchaine(9,1);
    		affiche(list);
    		Fibo2 croissant = triCroissant(list);
    		System.out.print("Triée : ");
    		affiche(croissant);
    	}
     
    }
    avec pour résultat par exemple :
    9->3->7->1->4
    Triée : 1->3->4->7->9
    Après, on pourra optimiser en "fusionnant echanger() dans la double boucle"...
    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.

  8. #8
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Euh, il y a erreur d’interprétation de votre part Joël. Que je sache, Izzy94 n'a jamais demandé qu'on lui explique comment réaliser un algorithme de tri ?
    De toute évidence, il essaie de faire le sien, et se trouve bloqué dans cette méthode car la raison pour laquelle celle-ci part en boucle infinie lui échappe.
    J'ai seulement tenté de lui faire comprendre un peu comme vous d'ailleurs qu'il lui faut traiter tous les cas de figure et pas seulement le cas où suivant est inférieur à courant tout en minimisant l'impacte de mon intervention sur son raisonnement. Je ne cherche pas à faire autrement que comme il compte faire. Quant à la modification de l'objet Fibo2, je suis pourtant clair, c'est uniquement pour une question de test et afin de faciliter la lecture du comportement de la méthode dans les trois cas concernés que je me suis permis de les ajouter. Ces deux propriétés ne participent pas à la comparaison, elles ne servent que de témoin.
    De plus, pour ce qui est du tri à bulles, vous êtes le seul à en parler. Izzy94 n'a jamais mentionné qu'il voulait agir ainsi, ce n'est qu'une hypothèse soulevée par vous, probablement la bonne, mais ça reste une hypothèse.
    Vu les informations données et la formulation utilisée la notion de tri ici n'est que le contexte, pas le problème, le problème est : Pourquoi ma boucle est infinie ?
    En tous cas, c'est comme cela que je le vois.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  9. #9
    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
    Citation Envoyé par yotta Voir le message
    Euh, il y a erreur d’interprétation de votre part Joël.
    Quelle erreur d'interprétation ?

    Citation Envoyé par Izzy94 Voir le message
    je cherche à créer trié par ordre croissant une liste chaîné simple
    C'est ce qui est écrit : "trié par ordre croissant". Je peux admettre l'interprétation sur la notion de "création", qui pourrait être par insertion. Mais la méthode du premier message s'appelle triV2 et il n'y a manifestement aucun argument qui correspondrait à une valeur à insérer dans une liste. Par ailleurs, Izzy94 répond à mon message en me donnant le code de sa classe, sans indiquer que ce n'est pas un tri qu'il chercher à faire. Il me semble que c'est une confirmation que c'est bien de tri qu'il s'agit.

    Citation Envoyé par yotta Voir le message
    Que je sache, Izzy94 n'a jamais demandé qu'on lui explique comment réaliser un algorithme de tri ?[
    De toute évidence, il essaie de faire le sien, et se trouve bloqué dans cette méthode car la raison pour laquelle celle-ci part en boucle infinie lui échappe.
    Oui, et c'est l'objet de ma première réponse.

    En tout cas, il ne s'agit en rien de chercher le plus petit des éléments de la liste.

    Citation Envoyé par yotta Voir le message
    Vu les informations données et la formulation utilisée la notion de tri ici n'est que le contexte, pas le problème, le problème est : Pourquoi ma boucle est infinie ?
    Et j'ai répondu à cette question.

    C'est toi qui a commencé à proposer un code qui répond à une question hypothétique, celle de trouver le plus petit des éléments d'une liste. Je recentre sur la question du tri. Le tri à bulle est une solution. J'ai dit précédemment que ce n'était pas celle qui me semblait la plus adaptée à une liste chaînée. Toujours est-il que c'est celui par lequel la plupart des débutants commencent. Et la notion d'échange dans le premier code est un indice sérieux qui oriente vers cette option.
    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.

  10. #10
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Désolé Joel si je vous ai agacé.
    J'aurai dû utiliser le mot différence au lieu d'erreur. En effet, il y a de toute évidence une différence d'interprétation du problème, et non pas erreur, j'ai fait preuve d'un peu de prétention.
    Cependant, cela m'a incité à trouver une solution basée sur mon hypothèse qui représente une technique que je me permet d'appeler "du plus petit".
    Plutôt que de me lancer dans une tirade interminable, voilà le code que j'ai produit sur cette hypothèse :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    package ListeChainee;
     
    import java.util.Random;
     
    /**
     *
     * @author yotta
     */
    public class Main {
     
        static int min = 1, max = 99;
        static Fibo2 listeTriee = null;
        static Random calc = new Random();
     
        public static void main(String args[]) {
            // Fabrication d'une liste chaînée de 10 éléments Fibo2.
            Fibo2 test = fabriqueListeChainee(10);
            // Affichage sous forme de liste du chaînage
            afficheListeChainnee(test);
            // Tri du chaînage par ordre croissant selon la technique "du plus petit".
            Fibo2 testTrie = triFinal(test);
            // Affiche sous forme de liste le chaînage résultant du tri.
            afficheListeChainnee(testTrie);
            }
     
        static Fibo2 getLstChaine() {
            // Renvoie un Fibo2 avec une valeur aléatoire pour sa propriété data comprise entre 1 et 99.
            Fibo2 lst = new Fibo2();
            lst.data = calc.nextInt(max - min + 1) + min;
            return lst;
            }
     
        static Fibo2 fabriqueListeChainee(int NbrTermes) {
            // Construit une liste chaînée de NbrTermes séquentiellement.
            Fibo2 premier = null;
            Fibo2 memo, reponse;
            reponse = getLstChaine();
            for (int i = 1 ; i <= NbrTermes-1 ; i++) {
                memo = premier;
                premier = getLstChaine();
                if (memo != null) memo.jepointevers = premier;
                else reponse.jepointevers = premier;
                }
            return reponse;
            }
     
        @SuppressWarnings("UnusedAssignment")
        static Fibo2 trouvePlusPetit(Fibo2 aTrier) {
            // Ici, on extrait le premier Fibo2 trouvé possédant la plus petite valeur data et on le soustrait de la liste chaînée pour le renvoyer avec un suivant null.
            Fibo2 cible;
            Fibo2 suivant, precedent = null, memoPrecedent = null;
            cible = aTrier;
            suivant = cible.jepointevers;
            if (cible.jepointevers != null) precedent = cible;
            while (suivant != null) {
                if (suivant.data < cible.data) {
                    // Changement de cible car on a trouvé un élément avec un data plus petit.
                    cible = suivant;
                    // On mémorise son précédent pour modifier son chaînage, ce qui revient à dire, le retirer de la liste chaînée.
                    memoPrecedent = precedent;
                    }
                // suivant devient le précédent avant le glissement.
                precedent = suivant;
                // Glissement du 'pointeur' de notre liste chaînée.
                suivant = suivant.jepointevers;
                }
            if (memoPrecedent != null) {
                memoPrecedent.jepointevers = cible.jepointevers;
                cible.jepointevers = null;
                }
            // Dans le cas particulier où le plus petit élément est le premier, il faut faire glisser notre 'pointeur' de liste chaînée principale pour occulter le premier.
            else aTrier = aTrier.jepointevers;
            return cible;
            }
     
        static void afficheListeChainnee(Fibo2 lst) {
            Fibo2 valTmp = lst;
            System.out.println(valTmp.data);
            while (valTmp.jepointevers != null) {
                valTmp = valTmp.jepointevers;
                System.out.println(valTmp.data);
                }
            System.out.println();
            }
     
        static Fibo2 triFinal(Fibo2 org) {
            Fibo2 valTmp;
            Fibo2 memoListeTriee = null;
            while (org.jepointevers != null) {
                valTmp = trouvePlusPetit(org);
                // Ici, j'utilise la propriété suivant de valTmp comme d'un boolean pour savoir si le plus petit renvoyé serait par hasard le premier de la liste.
                // Tel que si valTmp.jepointevers est null, ce n'est pas le premier, mais si valTmp.jepointevers n'est pas null, alors il l'est.
                if (valTmp.jepointevers != null) {
                    // Cas où valTmp, le plus petit, représente aussi le premier de la liste.
                    // Puisqu'il s'agit du premier élément, il suffit de faire glisser org sur son deuxième élément, puis de mettre suivant de son premier élément à null pour l'occulter complètement de la liste chapinée d'origine.
                    org = org.jepointevers;
                    valTmp.jepointevers = null;
                    }
                if (listeTriee == null) {
                    // Si listeTriee est null, c'est que nous sommes sur le premier élément de notre liste triée.
                    // Il est alors impératif de mémoriser ce dernier dans une autre classe, car nous allons le faire glisser tout au long de son remplissage.
                    listeTriee = valTmp;
                    memoListeTriee = listeTriee;
                    }
                else {
                    // listeTriee existe, on se contente de remplir.
                    listeTriee.jepointevers = valTmp;
                    listeTriee = listeTriee.jepointevers;
                    }
                }
            // En sortie de boucle, il ne reste naturellement dans org que le dernier élément qu'il suffit d'ajouter à la fin de notre liste triée en ayant pris soin de mettre son suivant à null.
            listeTriee.jepointevers = org;
            return memoListeTriee;
            }
        }
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

Discussions similaires

  1. Trier une liste chainée.
    Par gregb34 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 21/05/2006, 22h05
  2. Trier une liste de dossiers et de fichiers
    Par steveleg dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 16h54
  3. trier une list
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 12h01
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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