Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe in meinen Code eine Hashtable, der ich mit meiner Methode neue Werte zuweisen will.
Bis jetzt gehe ich die Hashtable bloss durch und die Methode sieht so aus
Java:
public void addRessourcen(Hashtable<Ressource, Integer> neueRessourcen){
Set<Ressource> keys = verfuegbareRessourcen.keySet();
for(Iterator<Ressource> i = keys.iterator(); i.hasNext();){
Ressource r = i.next();
int vorrat = verfuegbareRessourcen.get(r)+neueRessourcen.get(r);
// hier käme dann die neue Zuweisung, also Pseudocode:
// verfuegbareRessourcen.r = vorrat
}
}
normalerweise würde ich jetzt einfach mit remove(r) diesen key rauslöschen und ihn mit put(r, vorrat) wieder einfügen, allerdings bin ich mir nicht sicher, ob ich damit das iterieren durcheinanderbringe, sprich er diese Elemente einfach hintenanfügt und dann endlos die Schleife weiterdurchläuft.
gibt es noch eine andere Möglichkeit den Wert zu verändern?
public Set<K> keySet()
Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
Allerdings sollte es problemlos möglich sein einem bereits bestehenden Key einen neuen Wert zuzuweisen.
Java:
verfuegbareRessourcen.put(r, vorrat);
Dazu kann ich zwar gerade keine belastbare Quelle angeben, doch der Quellcode der Hashtable lässt darauf schließen, daß das Keyset dadurch nicht verändert wird. Es wird lediglich der alte Wert des Keys durch den neuen ersetzt.
Kann aber sein, dass es dann eine ConcurrentModificationException gibt (eventuell). Falls ja: Ein Pattern, das ich in solchen Fällen nicht schlecht finde, ist, einmal drüberzulaufen, und sich alles zu speichern, was geändert werden muss (z.B. eine [c]Map<Ressource, Integer> updates[/c]) die man am Ende verwendet, um alle Updates auf einmal in die ... Map zu legen. (Es sollte eine Map sein - keine Hashtable...)
OK danke, manchmal empfiehlt es sich wirklich sich die java-doku genauer anzuschauen.
Falls ja: Ein Pattern, das ich in solchen Fällen nicht schlecht finde, ist, einmal drüberzulaufen, und sich alles zu speichern, was geändert werden muss (z.B. eine Map<Ressource, Integer> updates ) die man am Ende verwendet, um alle Updates auf einmal in die ... Map zu legen. (Es sollte eine Map sein - keine Hashtable...)