Map manipulation

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

vielleicht eine triviale Frage, aber wie stelle ich es denn am geschicktesten an,
wenn ich die Daten in einer bestehenden Map ändern will.
Die Ausgangssituation is derart, dass ich ne bestehende Map habe, nun tritt ein
Ereignis ein aufgrund dessen ich die Daten meiner Map updaten will.
Da ich aber nicht genau weiß, welche Einträge betroffen sind, würde ich gern über die
Map iterieren. So und da liegt natürlich das Problem, wenn ich nun was ändern will
während der Iterator darüber läuft, gibts natürlich Stress (-> ConcurrentModificationException).
Leider habe ich bisher nur Methoden gesehen, die mir ein Set liefern, dass ja etwas
eingeschränkt im ändernden Zugriff ist.
Ein Möglichkeit ist zwar die toArray() Methode, die gibt ja ein Object[] zurück.

Aber vielleicht geht es ja eleganter?!?

MfG
Sven
 

Wildcard

Top Contributor
So und da liegt natürlich das Problem, wenn ich nun was ändern will
während der Iterator darüber läuft, gibts natürlich Stress (-> ConcurrentModificationException).
Du musst über den Iterator ändern, dann gibts auch keine Probleme!
 
G

Gast

Gast
Hmm ... also wenn ich folgendes mache

Iterator iter = this.alreadyProcessed.entrySet().iterator();

while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
entry.setValue(new Integer(0));

}

Kriege ich leider die Exception :(
 

Wildcard

Top Contributor
Was genau willst du denn machen? Wenn du zum beispiel eine HasMap verwendest kannst du doch einfach die neuen Werte ohne Iterator einfügen! Erklär bitte mal genauer was du machen willst!
 

meez

Top Contributor
Geh halt über die Keys...

Code:
for (Iterator iter = this.alreadyProcessed.keySet().iterator();iter.hasNext();) {
  KeyType key= (KeyType)iter.next();
  map.put(key, new Integer(0));
}

Oder zieh das Integer Objekt zuerst raus, und setzte einen neuen Wert. (Möglich bei Mutable Objekten)
 
G

Gast

Gast
gut ok ... werd ich mal probieren.
Aber bei mir gabs eben bei put immer diese Exception
 

bambi

Bekanntes Mitglied
Hier mal ein Beispiel wie's geht:

(Der Code fuegt das Object timesToInsert mal n die Map ein - nicht besonders sinnvoll - iss aber nur ein Beispiel :wink:)

Du musst nach dem Aendern der Map das Set und den Iterator neu setzen - dabei wird die Map aber natuerlich mehrfach
durchlaufen - nicht besonders performant...

Code:
public void changeMap(Object key, Object objToInsert, int timesToInsert)
    {
        int numOfInserts = 0;
        
        Set set = map.keySet();
        Iterator iter = set.iterator();
        
        Object currentKey = null;
        Object currentObject = null;
        
        while (iter.hasNext() && numOfInserts < timesToInsert)
        {
            currentKey = iter.next();
            currentObject = map.get(currentKey);
            
            map.put(key, objToInsert);
            numOfInserts++;
            
            // das Set und den Iterator neu setzen...
            set = map.keySet();
            iter = set.iterator();
            
            System.out.println("inserted object \"" + objToInsert + "\" with key \"" + key + "\"");
        }
        System.out.println("changes done ...");
    }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben