2010-11-03 7 views
1

J'utilise un TreeMap<Integer,Object>() pour stocker des valeurs.
Maintenant, mon Object a un composant, Object.value(), qui continue d'être incrémenté selon les valeurs lues dans un fichier.
Donc,, j'évalue si la clé existe et doit mettre à jour la valeur.
Je ne comprends pas comment je peux mettre à jour les valeurs dans un Map en Java.
Je ne peux pas simplement remplacer l'ensemble de l'enregistrement, car de nouvelles valeurs doivent être ajoutées à la valeur d'enregistrement existante.
Existe-t-il une meilleure façon de procéder que d'utiliser une carte? J'ai utilisé une carte car je continuerai à chercher les clés.
Des suggestions?Comment puis-je mettre à jour des valeurs dans une carte?

+1

L'objet est un type Java réel. Donc, vous ne voulez pas l'utiliser a un type d'exemple jamais. – shoebox639

+0

J'ai corrigé l'orthographe et le formatage de votre message. Notez que Java est sensible à la casse et à l'orthographe, donc si votre code utilise réellement 'treemap' ou' Intger', vous aurez des erreurs et serez incapable de construire. – Pops

Répondre

3

Bien utiliser une carte est correct si vous voulez être en mesure d'accéder rapidement à vos paires clé-valeur. Si vos valeurs sont MyObjects avec un .value(), ne pouvez-vous pas obtenir l'objet et réinitialiser cette valeur?

MyObject myObj = treeMap.get(key); 
myObj.setValue(myObj.getValue()++); 

J'utilise MyObject ici comme l'affiche utilisait Object pour désigner un type d'exemple.

+1

Bonne réponse, mais peut-être utiliser MyObject pour éviter toute confusion? –

+0

Lol ok je vais le faire. L'affiche devrait aussi bien. – shoebox639

0

Votre "objet" doit avoir un setter qui met à jour la valeur. Donc, vous venez de récupérer l'objet en question sur la carte, appelez le setter sur cet objet, et voilà. Le seul obstacle que vous devez prendre en compte est que quoi que vous fassiez dans votre méthode setXXX ne modifie pas la sortie des méthodes equals et hashCode, car cela viole les invariants impliqués par le TreeMap et entraînera un comportement imprévisible. Vous objet pourrait ressembler à ceci:

class AnObject { 
    private int cnt; 
    public void increment() { this.cnt++ }; 
} 

Vous pouvez tirer de la TreeMap, appelez increment() et ne pas modifier le contenu du TreeMap lui-même.

0

Je ne suis pas sûr de ce que vous essayez de faire, mais si vous voulez juste stocker des objets avec des clés, vous devez utiliser une table hachage. Il permet de mapper les clés aux objets.

//create a hashtable 
//the first template type is the type of keys you want to use 
//the second is the type of objects you store (your Object) 
Hashtable <Integer,MyObject> myHashtable = new Hashtable <Integer,MyObject>(); 

//Now you create your object, and set one of its fields to 4. 
MyObject obj = new MyObject(); 
obj.setValue(4); 

//You insert the object into the hashtable, with the key 0. 
myHashtable.put(0,obj); 

//Now if you want to change the value of an object in the hashtable, you have to retrieve it from its key, change the value by yourself then re-insert the object into the hashtable. 
MyObject obj2 = myHashtable.get(0); 

obj.setValue(obj.getValue() + 2); 

//This will erase the previous object mapped with the key 0. 
myHashtable.put(0,obj); 

Espérons que cela aide.

+0

Vous le confondez probablement en suggérant que HashTable n'est pas une carte. –

+1

HashMap est également préféré à Hashtable sauf si vous avez un besoin particulier de synchronisation. –