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 :

création de HashMap<ArrayList<String>, ArrayList<String>>


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut création de HashMap<ArrayList<String>, ArrayList<String>>
    Bonjour,

    J'ai besoin de lier deux types de ArrayList<String>
    J'ai pensé à créer une HashMap dont la key serait le premier ArrayList<String> et la value le ArrayList<String> coresspondant.

    Pour tester, j'ai fais ce 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
    public HashMapTest() {
    		keyList.add("a");
    		keyList.add("b");
    		keyList.add("c");
    		valueList.add(""+1);
    		valueList.add(""+2);
    		valueList.add(""+3);
    		keyValue.put(keyList, valueList);
    		keyList.clear();
    		valueList.clear();
     
    		keyList.add("aa");
    		keyList.add("ba");
    		keyList.add("ca");
    		valueList.add("1a");
    		valueList.add("2a");
    		valueList.add("3a");
    		keyValue.put(keyList, valueList);
    		keyList.clear();
    		valueList.clear();
     
    		ArrayList<String> resultat=new ArrayList<String>();
    		ArrayList<String> resultatKey=new ArrayList<String>();
    		resultatKey.add("aa");
    		resultatKey.add("ba");
    		resultatKey.add("ca");
    		resultat=(ArrayList<String>)keyValue.get(resultatKey);
     
    		for(int i=0; i<resultat.size(); i++)
    		{
    			System.out.println(resultat.get(i));
    		}
    	}
    Il me revoie dans le console le message d'erreur:
    java.lang.NullPointerException
    Au niveau de la ligne de la boucle for. Apparemment, il n'aime pas que je mettre comme key des ArrayList, vu que j'ai créé des HashMap<String, ArrayList<String>> sans aucun problème.

    Je n'ai pourtant pas vu de contre indication dans les API java.

    Est-ce que quelqu'un pourrait me dire pourquoi mon code ne fonctionne pas, ou à défaut m'indiquer une autre méthode pour lier mes deux types d'ArrayList?

    Je vous remercie vivement d'avance !! :-)

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Balbuzard Voir le message
    Je n'ai pourtant pas vu de contre indication dans les API java.
    Dans la doc de Map :
    Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.
    Bref les objets modifiables ne devrait pas être utilisé comme clef, car cela casse le système de hashage basé sur le hashCode Le hashCode change et on ne retrouve plus la clef...


    Les clefs des Map devraient être des valeurs immuables !

    a++

  3. #3
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Merci de ta réponse.
    Déjà, je comprends pourquoi mon code ne fonctionne pas. J'avais pas compris ce passage de cette façon, pour moi, les arguments que je passais à la HashTable étaient immuables, vu que je ne repassai pas derrière pour les modifier, alors que ce sont les ArrayList qui doivent rester tels quels.

    Maintenant, est-ce que quelqu'un saurait comment constituer une key comportant plusieurs String? J'ai essayé de concaténer tous ces String, et me retrouver avec un seul String, et ça marche bien, mais maintenant, mes ArrayList de String deviennent trop grand pour être concaténés en un seul (plus de 256 caractères)

    Je cherche à créer une HashTable ayant plusieurs String constituant une seule key :-S
    Merci de vos conseil :-)

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je ne sais pas quelle est la taille limite d'un String, mais on peut largement dépasser 256 caractères, heureusement !

    De toutes façons, je ne suis pas sûr que un HashMap soit bien adapté à ton problème ; les ArrayList et assimilés sont des objets intrinsèquement variables (meme si on peut en trouver des immuables), et c'est un peu malabile de les utiliser comme clefs. Ne pourrais-tu pas te constituer une classe style Couple, dont chaque instance regrouperait deux ArrayList<String>, et ensuite te faire une ArrayList<Couple> ?

    Et de toutes façons, une fois que tu aurais ton hash de ArrayList<String>, comment feras-tu pour l'affecter à tes ArrayList en clefs ? Enfin bon si tu trouves, peut être pourras-tu t'aider avec la classe Arrays, qui comporte de nombreuses méthodes pour trouver le hashcode de tableaux.

  5. #5
    Membre confirmé Avatar de misterdi
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut
    Salut,

    Pour le type de données à utiliser, je ne sais pas, mais pour l'erreur que tu as eu, ça je peu expliquer (enfin je crois)

    Dans ton code tu remplis tes tableaux et tu les mets dans ta map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    keyList.add("a");
    keyList.add("b");
    keyList.add("c");
    valueList.add(""+1);
    valueList.add(""+2);
    valueList.add(""+3);
    keyValue.put(keyList, valueList);
    Ensuite tu demande de vider ces tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    keyList.clear();
    valueList.clear();
    L'ennui c'est qu'en Java, tout est implicitement des pointeurs... Donc en les vidant, tu vide aussi c'est de ta HashMap (puis que en fait ce sont les mêmes tableaux en mémoire), d'où le NullPointerException.

    Maintenant, je crois me rappeler que l'égalité sur deux tableaux est définie par l'égalité des éléments deux à deux (a == b ssi a[1]==b[1] et a[2] == b[2] et ...) (à vérifier dans la doc), donc à priori tu peux utiliser un Array comme clé pour autant que tu ne modifie pas ses valeurs une fois que tu l'as passé à ta HashMap.

    Si ma petite explication plus haut ne parait pas trop claire, essaye peut-être d'utiliser un outils de debuging pour voir ce qui se passe au niveau de tes variables.

  6. #6
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponse, je comprends mieux pourquoi j'ai eu ce problème; C'est déjà ça :-)

    Je vais continuer je pense à faire comme je faisais jusqu'à présent, c'est à dire concaténer mes String.

    Je dois avouer que j'aurais préféré trouver un moyen d'avoir des tableaux en guise de cléfs, car ça m'aurait permis de rajouter une autre caractéristique dans ma clée sans devoir revoir en entier tout mon string.

    Je ne suis pas sur de faire une classe de type couple dont chaque instance regroupe deux arrayList, j'ai l'impression qu'avec cette méthode, je serai tôt ou tard obligé de stocker des données en dur, et je n'ai pas le droit de le faire.

    Bon, voilà, merci encore :-)

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Balbuzard Voir le message
    Je dois avouer que j'aurais préféré trouver un moyen d'avoir des tableaux en guise de cléfs, car ça m'aurait permis de rajouter une autre caractéristique dans ma clée sans devoir revoir en entier tout mon string.
    Tu peux faire cela, à condition qu'ils ne soit pas modifiable et que tu définisses bien les méthodes d'identité equals() et hashCode() et que tu utilises l'immuabilité :
    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
    public final class MultiStringKey {
     
    	private final String[] values;
     
    	public MultiStringKey(String...args) {
    		this.values = args.clone();
    		// On tri le tableau
    		// (a moins que l'ordre soit important)
    		Arrays.sort(this.values);
    	}
     
    	public String[] values() {
    		return this.values.clone();
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (obj==this) return true;
    		if (obj instanceof MultiStringKey) {
    			return Arrays.equals(this.values, ((MultiString)obj).values);
    		}
    		return false;
    	}
     
    	@Override
    	public int hashCode() {
    		return Arrays.hashCode(this.values);
    	}
     
    	@Override
    	public String toString() {
    		return Arrays.toString(this.values);
    	}
    }

    Mais une question : quel est l'intérêt de cette association de tableaux dans une Map ?

    a++

  8. #8
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    L'intérêt:

    Je dois exporter des fichiers xml dans différents formats: pdf, txt, csv,...
    Les fichiers xml sont définis par leur titre, des numéros d'indentifications, leur type (plusieurs natures différentes) et éventuellement d'autres valeurs au cas où ce qui précède n'est pas suffisant pour définir le fichier de manière unique.

    Chaque catégorie de fichiers xml (titre, numIDENT, type, ...) a besoin de son fichier xsl pour être exporté.

    J'ai concaténé toutes les caractéristiques pour en faire un unique String. J'ai mis ces strings dans une HashMap en tant que key, et les chemins vers les fichiers xml en tant que value.

    J'aimerais pouvoir en faire un ArrayList plutôt qu'un String, car des nouvelles caractéristiques apparaissent régulièrement, et du coup, c'est pas évident au niveau de la maintenance de tout redéfinir à chaque fois.

    Ce que je pense faire :
    Je pense faire l'opération inverse, càd je mets les chemins d'accès en tant que key, et je leur associe les caractéristiques. J'utilise ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ArrayList<String> reading=new ArrayList<String>();
    reading.add(exportType);
    reading.add(version);
    reading.add(name);
    reading.add(tag);
    for(String key: myDialog.getPDFXSLMap().keySet()) {
          if(reading.equals(myDialog.getPDFXSLMap().get(key))) {
    	  myDialog.getXSLPDFFileLocationTable().add(key);
    	  JOptionPane.showMessageDialog(myDialog.getPanelAuto(), key);
          }
    }
    Mais aucune JOptionPane ne s'affiche. Je me demande si du coiup j'ai pas le problème inverse de précédement, ou bien si j'utilise bien la méthode equals.

    Tu aurais une idée?
    Sinon, j'utiliserai la classe que tu m'as donnée

    Merci beaucoup :-)



    EDIT:
    Non, en fait, ma méthode marche, donc c'est elle que je vais utiliser, je me suis juste gouré dans les ArrayListe que je comparais.

    Merci beaucoup pour ton aide!!

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

Discussions similaires

  1. [ArrayList] contains() sur une liste de String
    Par nicotine002 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/01/2008, 19h19
  2. Probleme création de HashMap
    Par Katachana dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 17/04/2007, 17h05
  3. [Débutant] String[] ou ArrayList<String> ?
    Par Warz dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 24/11/2006, 01h27
  4. création d'un ficher CSV a partir d'un chaine String
    Par edouard21 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/03/2006, 16h46
  5. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 13h25

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