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

Collection et Stream Java Discussion :

Tableau d'entiers qui ne se rempli pas


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 59
    Par défaut Tableau d'entiers qui ne se rempli pas
    Bonjour à tous,
    Voilà pour les besoins d'un TP , j'ai eu a faire une simulation de hachage , c'est un code facile mais je n'arrive pas à comprendre pourquoi à l’exécution mon tableau qui devrait recevoir des entiers (les index d'un tableau en entrée) ne se rempli par au fur et a mesure de la boucle !!!
    voilà le code
    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
    package TP8;
     
    public class HashLinearProbing {
     
    	public static char Keys[] = new char[11];
    	public static int Values[] = new int[11];
     
    	// Fonction de hachage par modulo sur le code ascii d'un caractère en entrée 
    	public static int hash(char key, int M){
    	int hash;
    	int ascii;
    	ascii=(int) (key); // récupère le code ASCII d'un caractère
    	hash=ascii % M;	// hachage par modulo
    	return hash;
    	}
    	public static void put(char key,int value){
    		int M = 11;
    		int index;
    		index = hash (key,M);
    		while (Keys[index] != '\0') {
    				index = (index + 1);
    				}
    				Keys[index] = key;
    				Values[index] = value;
    	}
     
    	public static void main(String[] args) {
    		//Déclaration de ma table d'entrée R (Exemple du cours "Hash Table Linear Probing exemple")
    		char R[]= new char[10];
    		R[0]='B';
    		R[1]='O';
    		R[2]='E';
    		R[3]='P';
    		R[4]='C';
    		R[5]='L';
    		R[6]='X';
    		R[7]='N';
    		R[8]='D';
    		R[9]='M';
    		System.out.println("La table de données en entrée est la suivante :");
    		System.out.println(R);
    		System.out.println("***************************************************");
    		int i;
    		for (i=0; i<R.length; i++) {
    			put(R[i],i);	
    		}
    		System.out.println(Keys);
    		System.out.println(Values);
    	}
     
    	}
    voilà j'ai l'impression que cette instruction ne s’exécute pas : Values[index] = value; à la compilation je retrouve ce résultat:
    [I@4cf2f585
    Alors que le premier tableau (Keys) se rempli normalement !!!

    s'il vous plait je vais devenir folle

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    La déclaration de tes tableaux ne corresponds pas à ce que tu veux en faire.

    Si je lis ton algorithme on a :
    1. Je déclare deux tableaux A et B d'index 0 à 9
    2. Pour le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char R[] ={'B','O','E','P','C','L','C','X','N','D','M'};
    2.1 Je trouve le hash
    2.2a Si le tableau n'a plus la valeur par défaut, je place la valeur à l'index du hash dans A et l'index de R à l'index du hash.
    2.2b Sinon j'ajoute 1 au hash et je refait 2.2a
    Le problème est le suivant :
    Tu n'as aucune chance que ton hash se trouve systématiquement entre 0 et 9 !

    Deux problèmes à cela !
    Ton M est trop grand :
    Devrait être à 9 !
    Et à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (Keys[index] != '\0') {
    index = (index + 1);
    }
    tu devrait avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (Keys[index] != '\0') {
    if(index >=M){
    index = 0;
    }
    index = (index + 1);
    }
    Sinon tu peux faire :
    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
    package TP8;
     
    public class HashLinearProbing {
     
    	public static char Keys[] = new char[11];
    	public static int Values[] = new int[11];
     
    	// Fonction de hachage par modulo sur le code ascii d'un caractère en entrée
    	public static int hash(char key, int M) {
    		int hash;
    		int ascii;
    		ascii = (int) (key); // récupère le code ASCII d'un caractère
    		hash = ascii % M; // hachage par modulo
    		return hash;
    	}
     
    	public static void put(char key, int value) {
    		int M = 9;
    		int index;
    		index = hash(key, M);
    		Keys[value] = key;
    		Values[value] = index;
    	}
     
    	public static void main(String[] args) {
    		// Déclaration de ma table d'entrée R (Exemple du cours
    		// "Hash Table Linear Probing exemple")
    		char R[] ={'B','O','E','P','C','L','C','X','N','D','M'};
    		System.out.println("La table de données en entrée est la suivante :");
    		System.out.println(R);
    		System.out
    				.println("***************************************************");
    		int i;
    		for (i = 0; i < R.length; i++) {
    			put(R[i], i);
    		}
    		System.out.println(Keys);
    		for (int j = 0; j < Values.length; j++) {
    			System.out.print(Values[j]+";");
    		}
    		System.out.println();
    		for (int j = 0; j < Values.length; j++) {
    			for (int k = 0; k < Values.length; k++) {
    				if(j== Values [k]){
    					System.out.print(Keys[k]+"-");
    				}
    			}
    		}
    	}
     
    }
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 59
    Par défaut
    Oui mais pourquoi alors le tableau Keys se rempli normalement, avec les valeurs théoriques !!! c'est à dire:
    BCOEPXNDM L
    Le hachage a bien eu lieu, ceci se fait en parcourant chaque caractère du tableau d'entrée R, en calculant le résultat de la fonction de hachage ; c'est à dire le code ascii du caractère modulo 11, le résultat sera l'index (la position) sur lequel placé le caractère en question dans le tableau Keys , et la valeur de son index d'origine dans le tableau values
    exemple
    Si B est le premier caractère du tableau R
    le hashage de B donne : code ascii de B( = 66 ) modulo 11 donne : 0 donc l'index est 0 , c'est a dire que Keys[0]=B et values[0]=0, pourquoi 0? parc que 0 est la position de B dans son tableau d'origine R

    voilà l'idée mais j'y arrive pas !!!! avec le tableau Values !!!!

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par masoum Voir le message
    à la compilation je retrouve ce résultat:
    [I@4cf2f585
    Alors que le premier tableau (Keys) se rempli normalement !!!
    D'abord ce n'est pas à la compilation mais à l'exécution que tu as cela.
    Ensuite ton algorithme va t'exploser à la figure dans les cas plus complexes (plus de 11 lettres, ou quand les 2 premières lettre ont un hash de 10, ou ... etc)
    Et finalement, pour ton problème, ce n'est pas comme ça qu'on affiche le contenu d'un tableau. Ce qu'il t'affiche juste c'est que "Values" est un tableau d'entiers. Pour afficher son contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		System.out.println(Arrays.toString(Keys));
    		System.out.println(Arrays.toString(Values));

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    D'abord ce n'est pas à la compilation mais à l'exécution que tu as cela.
    Ensuite ton algorithme va t'exploser à la figure dans les cas plus complexes (plus de 11 lettres, ou quand les 2 premières lettre ont un hash de 10, ou ... etc)
    Et finalement, pour ton problème, ce n'est pas comme ça qu'on affiche le contenu d'un tableau. Ce qu'il t'affiche juste c'est que "Values" est un tableau d'entiers. Pour afficher son contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		System.out.println(Arrays.toString(Keys));
    		System.out.println(Arrays.toString(Values));
    oUI OUI C'est exactement ça, voilà le problème est résolu Merci beaucoup

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

Discussions similaires

  1. [AC-2013] Sous formulaire qui ne se rempli pas a la main
    Par amina69 dans le forum Access
    Réponses: 0
    Dernier message: 17/07/2013, 10h15
  2. Le background qui ne se rempli pas.
    Par zooffy dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 14/08/2012, 08h20
  3. [VB2005] listview qui ne se rempli pas
    Par stolx_10 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 27/02/2009, 14h13
  4. contenu qui ne s'affiche pas en entier
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 02/11/2005, 12h34
  5. [HTML] Image en fond d'un tableau qui ne se répète pas.
    Par yoyot dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/02/2005, 17h08

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