2010-10-04 3 views
1
Set<String> tempSet = new HashSet<String>(); 
for (Map.Entry<String, String> entry : map.entrySet()) { 
    String orginalKeys = entry.getKey(); 
    System.out.println(orginalKeys); 
    String newKey = orginalKeys.replace('.','/'); 
    if (!newKey.equals(orginalKeys)) { 
     map.put(newKey, entry.getValue()); 
     tempSet.add(orginalKeys); 
     map.remove(orginalKeys); 
    } 
} 
System.out.println(map); 

Cela remplace une seule clé, mais je veux remplacer tous les cas avec les occurrences ci-dessus. Quelle est la mauvaise chose que je vais avec?remplacer toutes les clés dans hashmap en commençant par un caractère

+0

Il vous manque un accolade de fermeture dans votre code. –

+0

@ Péter où il manque? – Reddy

+0

@Reddy, plus maintenant, Andreas l'a corrigé depuis. –

Répondre

1

idéalement ce code devrait lancez java.util.ConcurrentModificationException lorsque vous parcourez map.entrySet()) et que vous mettez à jour en même temps map.put (newKey, entry.getValue());

Comme indiqué plus haut, vous pouvez créer une nouvelle carte temporaire et le remplacer par origine un

ou vous pouvez obtenir les clés dans une liste et itérer la liste

String[] keyArray = map.keySet().toArray(new String[map.size()]); 
    Set<String> tempSet = new HashSet<String>(); 
    for (String orginalKeys : keyArray) { 
     System.out.println(orginalKeys); 
     String newKey = orginalKeys.replace('.', '/'); 
     if (!newKey.equals(orginalKeys)) { 
      map.put(newKey, map.get(orginalKeys)); 
      tempSet.add(orginalKeys); 
      map.remove(orginalKeys); 
     } 
    } 
    System.out.println(map); 
1

Je ne sais pas si vous pouvez modifier une carte en l'itérant. Essayez de collecter les entrées pour les modifier dans une liste, puis faites une boucle sur cette liste pour effectuer les modifications.

3

Je ne vois aucun problème avec ce code. En supposant, votre carte a plus d'une clé qui correspond à la critique, par exemple. contient au moins un point (.), plus d'une nouvelle clé doit avoir été créée avec les valeurs tirées des clés d'origine et plusieurs d'entre elles doivent avoir été supprimées.

Une autre approche: il suffit de créer une nouvelle carte et déposer l'ancien:

Map<String, String> newMap = new HashMap<String, String>(); 
for (Map.Entry<String, String> entry : map.entrySet()) 
    newMap.put(entry.getKey().replace('.', '/'), entry.getValue()); 
map = newMap; 

(Si vous avez besoin que tempSet, modifiez le code dans la boucle)

+0

cela remplacera-t-il toutes les clefs avec le caractère de POINT ou un? – John

+0

Il créera une nouvelle paire clé/valeur pour chaque paire clé/valeur de la carte source et chaque clé aura tous les points remplacés par des barres obliques. –

2

Cette remplace uniquement une clé, mais je veux remplacer tous avec les occurrences ci-dessus. Quelle est la mauvaise chose que je vais avec?

Normalement, je m'attendrais à ce que votre code donne ConcurrentModificationException. Le problème est que vous modifiez la carte pendant que vous l'itérez.

Le javadoc for HashMap dit ceci:

« Les itérateurs renvoyés par tous de cette classe « vue de la collecte des méthodes » sont fail-rapide: si la carte est structurellement modifiée à tout moment après l'itérateur est créé, en de toute façon, sauf par la méthode de suppression de l'itérateur, l'itérateur lancera un ConcurrentModificationException1. Ainsi, face à une modification simultanée, l'itérateur échoue rapidement et proprement, plutôt que de risquer un comportement arbitraire et non déterministe à un moment indéterminé dans le futur. " "Notez que le comportement fail-fast d'un itérateur ne peut pas être garanti car il est généralement impossible de faire des garanties strictes en présence de modifications simultanées non synchronisées: les itérateurs ConcurrentModificationException sur un meilleur effort Par conséquent, il serait erroné d'écrire un programme qui dépendait de cette exception pour son exactitude: le comportement fail-fast des itérateurs devrait être utilisé uniquement pour détecter les bogues. "

Si vous regardez à la fois ma solution et la solution de @Colin Herbert dans les réponses à your previous question, vous verrez que nous enregistrons soigneusement ce qui doit être changé dans les structures de données distinctes. Ce n'est que lorsque l'itération est terminée que nous apportons les changements à la carte originale. C'est critique. Sans cela, les solutions ne fonctionnent pas.

Questions connexes