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 :

[Math]Problème avec tri


Sujet :

Java

  1. #1
    HNT
    HNT est déconnecté
    Membre actif Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Points : 293
    Points
    293
    Par défaut [Math]Problème avec tri
    Bonjour, dans le cadre de mon cours de première de java, je dois développé un soft qui servirait à gérer des mémoires (de fin d'étude) seulement la je suis en train de m'arraché les cheveux sur une méthode foireuse de tri. Voila je vais vite résumé l'apli : on a 4 types d'objet : un regsitre principal (tableau de section) en dessous on a des sections (registre de mémoires et nom de la séction) encore en-dessous on a Un registre de mémoires (tableau de mémoires) puis finalement les mémoires (données diverses...) Mon pb : dans la classe de l'objet RegistreMémoire je dois pouvoir ajouté des mémoires à un tableau en les gardant trié (par un identifiant), cette méthode foire. Voici son code et celui des méthodes qui sont utilisée par celle-ci :
    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
     
         public void ajoutDUnMémoire(Mémoire mémoire, String section)throws IdentifiantException
    	  {
    	  		if (tailleLogique == MAX) agrandirTableau();
    			String id = créerIdentifiant(mémoire, section);//Expliquer mode ajout id ds reg (intro)
    			if (tailleLogique == 0)insertion(id, mémoire,0);
    			else 
    			{	
    					int j = 	tailleLogique;		
    					while(j > 0 && registre[j-1].getIdentifiant().compareTo(id)>0)//??Erreur??
    					{
    						registre [j+1] = registre[j];
    						j--;
    					}	
    					if (j > 0 && registre[j-1].getIdentifiant().compareTo(id)==0)
    					{	
    						if (registre[j-1].getIdentifiant().length()==8)//pas de chiffre
    						{
    							id += 1;
    							insertion(id, mémoire,j);
    							return;
    						}
    						else //des chiffres length = 9
    						{
    							int num = (int) registre[j-1].getIdentifiant().charAt(8);
    							id += num++;
    							insertion(id, mémoire,j);
    							return;			
    						}
    					}
    					else insertion(id, mémoire,j);
    			}
    	  }
         private void insertion (String id , Mémoire mémoire, int pos)throws IdentifiantException
    	  {
    	  		registre [pos] = mémoire;
    			registre[pos].setIdentifiant(id);
    			tailleLogique ++;
    	  }
    	  private String créerIdentifiant (Mémoire mémoire, String section)
    	  {
    	  		String identifiant = mémoire.getSection().substring(0, 3);
    		   String année  = Integer.toString(mémoire.getAnnée());// transforme l'année en String   		
    		   identifiant += année.substring (année.length()-2, année.length());
             String nom = mémoire.getNom().toUpperCase();
             if (nom.length() < 3)
    			{
              	if ( nom.length() == 2) identifiant += nom+"_";
    				else identifiant+= nom+"__" ;
    			}
             else identifiant+= nom.substring(0,3); 
    			return identifiant.toUpperCase(); 
    	  }
              private void agrandirTableau()
    	  {
    	  		MAX *= 2;
    	  		Mémoire [] registre2 = new Mémoire [MAX];
    			  for (int i = 0; i< tailleLogique; i++)
    				 registre2 [i] = registre[i];
    		     registre = registre2;
    	  }
    Voila alors à partir de ce code des erreurs m'arrive à deux moments :
    1° Soit j'ajoute au moins 3 élèves à une meme section (donc meme registreMémoire) et alors le troisième n'est pas ajouté car j'obtient une nul pointer exception a la ligne 23 (while de la première méthode)
    2° Soit je n'ajoute que deux élèves à une meme section et un troisième à une autre section, dans ce cas c'est lorsque je voudrais afficher mes regsitres de mémoires que j'aurai une nul pointer exception. L'ajout se fait dans l'ordre section1-section2-section1.

    Voici l'UML de l'apli (pour que vous ayez une idée plus précise)

    Ce serait vraiment sympa de m'aider
    The box said : "Requires windows 95, NT or better" so I installed Linux.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Points : 100
    Points
    100
    Par défaut
    Ton problème est simple...
    Tu sors à cause du chipo que tu fais avec ta taille logique...

    Regarde bien, imagine le cas suivant:

    Taillelogique = 2
    Max = 3

    1° Il n'agrandit pas le tableau.
    2° Tu arrives ici il plante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                   int j =    tailleLogique;      
                   while(j > 0 && registre[j-1].getIdentifiant().compareTo(id)>0)//??Erreur??
                   {
                      registre [j+1] = registre[j];
                      j--;
                   }
    j = 2
    registre[j+1] = registre[j].... elle est ici ton erreur
    çà te donne au 1er tour:
    registre[3]... et là tu es en dehors de la taille physique du tableau qui est de 3 (là tu es à 4: 0,1,2,3)

    Alala les travaux de l'IPL
    Quelle série? Je suis dans la 2

  3. #3
    HNT
    HNT est déconnecté
    Membre actif Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Points : 293
    Points
    293
    Par défaut
    LOL, je suis dans la série une. Je suis tout à fait d'accord avec ton example cependant il y a queluqe chose qui n'est pas afficher : la variable MAX est settée à 25, donc mon preblème ne devrait pas arriver si vite il doit obligatoirement y avoir autre chose
    The box said : "Requires windows 95, NT or better" so I installed Linux.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Points : 100
    Points
    100
    Par défaut
    Bon je te donne ce que j'ai comme boucle à cet endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=(nbreMémoires-1);i>=0;i--) {
    }
    Ensuite, je fais seulement le test de savoir si je dois décaler ou si je dois ajouter, et çà tourne bien.

    Le problème c'est que comme çà je n'arrive pas vraiment à situer ton erreur ni comment la résoudre.

  5. #5
    HNT
    HNT est déconnecté
    Membre actif Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Points : 293
    Points
    293
    Par défaut
    Je ne sais pas qui tu es mais tu es béni lol, maintenant ca marche, voici mon code après correction :
    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
      public void ajoutDUnMémoire(Mémoire mémoire, String section)throws IdentifiantException
    	  {
    	  		if (this.critèreDeTri != 1) triRegistre(1);
    	  		if (this.tailleLogique == this.MAX-1) agrandirTableau();//pour la while qui suit (le j+1)
    			String id = créerIdentifiant(mémoire, section);//Expliquer mode ajout id ds reg (intro)
    			if (this.tailleLogique == 0)insertion(id, mémoire,0);
    			else 
    			{	
    					int j = 	this.tailleLogique-1;		
    					while(j >= 0 && this.registre[j].getIdentifiant().compareTo(id)>0)//??Erreur??
    					{
    						this.registre [j+1] = this.registre[j];
    						j--;
    					}	
    					if (j >= 0 && this.registre[j].getIdentifiant().compareTo(id)==0)
    					{	
    						if (this.registre[j].getIdentifiant().length()==8)//pas de chiffre
    						{
    							id += 1;
    							insertion(id, mémoire,j+1);
    							return;
    						}
    						else //des chiffres length = 9
    						{
    							int num = (int) this.registre[j].getIdentifiant().charAt(8);
    							id += num++;
    							insertion(id, mémoire,j+1);
    							return;			
    						}
    					}
    					else insertion(id, mémoire,j+);
    			}
    	  }
    The box said : "Requires windows 95, NT or better" so I installed Linux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/01/2006, 19h13
  2. probleme avec tri
    Par Burinho dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 07/01/2006, 23h55
  3. requete avec tri sur date erronée
    Par olivll dans le forum Access
    Réponses: 11
    Dernier message: 20/10/2005, 15h45
  4. pb avec tri de colonne via un KStringGrid
    Par steph_1 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 04/10/2005, 11h40
  5. requette de selection avec tries
    Par Thierry8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/08/2005, 16h48

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