Un point d'ombre avec la collection HashMap
fuks
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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 :
Voici la classe liste compte:
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"); } } }
A voir également:
- Un point d'ombre avec la collection HashMap
- Point de suite word - Guide
- Comment inserer une video dans un power point - Guide
- Point de restauration - Guide
- Point gps - Guide
- Comment envoyer un point gps par sms - Accueil - Téléphones
1 réponse
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 :
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 :
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.
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.