Un point d'ombre avec la collection HashMap

Fermé
fuks - 24 juin 2013 à 21:49
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 25 juin 2013 à 19:06
Salut à vous !

J'ai un problème avec mon programme le but du programme est d'enregistrer un compte ( saisi du numéro de compte ...).J'ai alors créé une classe LISTECOMPTE où je met en place la collection HASHMAP.Lors de l'execution du programme je crée un compte pas de problème mai lorsque je recherche le compte ( je dois saisir un numéro de compte ) il n'affiche rien !

Je pense avoir un problème au niveau de la classe liste compte dans la méthode creerUneCle. Cette méthode me permet de mettre comme cle d'association lors de l'ajout de l'objet le numéro de compte saisi lors de la recherche du compte. J'ai donc utilisé les génériques HashpMap<Long,Compte> .

Lors de la recherche du compte, j'ai automatiquement : le compte numéro XXXX n'a pas encore était ajouté ".

je vous montre Ma classe Compte :






package gestioncptebancaire;

import java.util.Scanner;

/**
 *
 * @author fuki
 */
public class Compte {

    //variables de la classe 
    private String type;
    public long numCpte;
    private long val;
    private double taux;

    //creer compte
    public Compte() {


        //apel de methode controle type
        controleType();


        System.out.println("Numero du compte : ");
        Scanner sc1 = new Scanner(System.in);
        numCpte = sc1.nextLong(); // saisie du numero de compte

        System.out.println("Premiere valeur creditee : ");
        controleValini();

        // si c'est un compte epargne alors on saisit le parametre du
        // taux de placement
        if (type.equals("epargne")) {
            System.out.println("Taux de placement : ");
            Scanner sc3 = new Scanner(System.in);
            taux = sc3.nextInt();
            System.out.println("%");
        }

    }//fin de la methode

    //methode set qui permet d'ecrire    
    //fonction afficher compte
    public void afficherCpt() {




        System.out.println("Type du compte [ courant, joint, epargne] : " + type);
        System.out.println("Numero du compte : " + numCpte);
        System.out.println("Premiere valeur creditee : " + val);

        if (type.equals("epargne")) {
            System.out.println("Taux de placement : " + taux + " %.");
        }

    }//fin de la fonction

    //controle type de compte
    private String controleType() {

        do {
            System.out.println("Type de compte [courant, joint, epargne]");
            Scanner sc = new Scanner(System.in);
            type = sc.nextLine();

        } while (!type.equals("courant") && !type.equals("epargne") && !type.equals("joint"));
        return type;
    }

    //controe valeur initiale
    private long controleValini() {

        do {

            System.out.println("Entrez une valeur");
            Scanner sc = new Scanner(System.in);
            val = sc.nextLong();

        } while (val < 0);
        return val;
    }
}


Voici la classe liste compte:





/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestioncptebancaire;

import java.util.HashMap;
import java.util.Scanner;

/**
 *
 * @author fuki
 */
public class ListeCompte {

    HashMap<Long,Compte> listeCompte;

    //constructeur
    public ListeCompte() {

        listeCompte = new HashMap<Long,Compte>();

    }

    //cle
    public long creerUneCle(Compte c) {

        long tmp = c.numCpte;

        return tmp;
    }

    //Ajouter un compte
    public void ajouteUnCompte() {

        Compte nouveau = new Compte();
        long cle = creerUneCle(nouveau);

        if (listeCompte.get(cle) != null)
        {
                    listeCompte.put(cle, nouveau);
        } else 
        {
            System.out.println("Compte deja ajoute");
        }

    }

    public void rechercheUnCompte() {

        System.out.println("Quel compte voulez vous consulter ? : ");

        System.out.println("Saisissez le numero du compte :");
        Scanner sc1 = new Scanner(System.in);
        long numCpte = sc1.nextLong();
        long cle = numCpte;
        if (listeCompte.containsKey(cle))
        {

            Compte a = (Compte) listeCompte.get(cle);
            a.afficherCpt(); // affiche compte 

        }
        else 
        {

            System.out.println("Le compte numero : " + numCpte + "n'est pas encore ajoute");
        }
    }
}

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
25 juin 2013 à 19:06
C'est quoi ta méthode main ?

D'après moi, c'est parce que ton compte n'est effectivement pas ajouté, en cause ta méthode d'ajout :

 //Ajouter un compte
    public void ajouteUnCompte() {

        Compte nouveau = new Compte();
        long cle = creerUneCle(nouveau);

        if (listeCompte.get(cle) != null)
        {
                    listeCompte.put(cle, nouveau);
        } else 
        {
            System.out.println("Compte deja ajoute");
        }

    }

Tu auras toujours null en faisant un get(cle) avec une clé qui n'existe pas, en particulier lorsque la map est vide, tu ne la remplis donc jamais, tu devrais donc toujours avoir "Compte deja ajoute".

Il faudrait au minimum remplacer ton test par celui que tu utilises ailleurs :

if (listeCompte.containsKey(cle))

De manière générale je trouve ton code mal pensé, je pense qu'un HashSet<Compte> correspondrait plus à tes besoins, en redéfinissant bien sûr le hashCode de ta classe Compte de manière judicieuse.
0