2012-11-21 3 views
3

J'ai classe, disons Hockey. La classe de hockey établira le score du hockey comme le code ci-dessous:Comment déplacer des valeurs dans une HashMap

public class Hockey{ 
    private HashMap<String, Integer> hockeyScore; 

    public Hockey(){ 
    hockeyScore = new HashMap<String, Integer>(); 
    } 

    public void setHockeyScore(String clubName, int score){ 
    hockeyScore.put(clubName, score); 
    } 
} 

Un match de hockey n'aura deux équipes et deux scores, il est possible d'échanger les scores? Par exemple, lorsque l'on insère dans hashmap et il vient avec les clés et valeurs ...

équipe 'a' = 23

équipe 'b' = 10

vous échanger les valeurs de la table de hachage qui ressemblera ...

équipe

'a' = 10

team 'b' = 23

Désolé les gars, je me demandais s'il existe une méthode qui permute les scores, sans utiliser manuellement les références 'a' et 'b'. Comme une fois que vous avez inséré des clés et des valeurs dans le hashmap, cette méthode permutera les valeurs.

+0

Utilisez 'String [2]' et 'int [2]' et permutez dans les tableaux. –

+0

Il est un peu exagéré d'utiliser un HashMap pour seulement deux et exactement deux entrées. Vous pouvez faire une classe, par exemple.ScoreResult, contenant le nom et le résultat, et soit deux instances dans deux variables, soit un tableau de cette classe avec deux entrées. – PhiLho

Répondre

1

Vous pouvez échanger Map entrées en utilisant ce one-liner:

hockeyScore.put(a, hockeyScore.put(b, hockeyScore.get(a))); 
6

Bien sûr, la façon dont vous échanger traditionnellement les valeurs:

Integer tmp = map.get(a); 
map.put(a, map.get(b)); 
map.put(b, tmp); 
+2

Requis commentaire "pas threadsafe". – djechlin

+0

Oh ouais, c'est totalement impossible à faire de manière atomique, même avec un 'concurrentMap' complet. –

+0

Pas avec la carte concurrente mais avec mon code simple ci-dessous – AlexWien

0

Je ne parviens pas à imaginer pourquoi vous voulez faire , mais cela n'est possible que dans le cas d'une carte avec 2 entrées - sinon, swap n'a aucun sens.

Mon Java est un peu rouillé, et je ne vais pas sortir Eclipse juste pour vérifier la syntaxe, mais quelque chose de tout à fait semblable à ce qui devrait faire le travail pour vous: Si vous êtes plus ambitieux

Map<string, int> swapped(string key1, string key2, Map<string, int> m) { 
    Map dummy = new HashMap<string, int>(); 

    dummy.put(key2, m.get(key1)); 
    dummy.put(key1, m.get(key2)); 

    return dummy; 
} 

, vous pourriez itérer les entrées pour obtenir les clés plutôt que d'avoir à les avoir disponibles.

0
Integer aScore = hockeyScore.get("a"); 
hockeyScore.put("a", map.get("b")); 
hockeyScore.put("b", aScore); 

et la variante threadsafe

synchronized (hockeyScore) { 
    Integer aScore = hockeyScore.get("a"); 
    hockeyScore.put("a", map.get("b")); 
    hockeyScore.put("b", aScore); 
} 
+0

Toujours pas threadsafe. Si les personnes qui font des choses autres que l'échange modifient votre carte, le verrou ne sera pas partagé correctement. Cependant, ceci est quelque peu discutable car on ne sait pas quel est l'invariant qui devrait être préféré dans la sécurité des threads, mais oui toute sorte de digression, les chances sont OP n'a pas cette préoccupation maintenant. – djechlin

+0

bien sûr, vous ne publierez pas la carte hockeyScore (si vous le souhaitez threadsafe)! tout accès à la carte doit être synchronisé, à chaque lecture, à chaque écriture! – AlexWien

0

Merci beaucoup pour votre aide!

J'ai trouvé une solution pour échanger les valeurs de la hashmap. J'ai d'abord rassemblé les partitions et les ai placées dans un arraylist et ensuite j'ai comparé l'arraylist à la hashmap et re set la carte de hachage selon l'arraylist.

public void swapScores(){ 
     for(Map.Entry<Team, Integer> getScores: winningTeam.entrySet()){ 
      if(scores.get(0).equals(getScores.getValue())){ 
       getScores.setValue(scores.get(1)); 
       System.out.println(getScores.getKey().getTeamName()+":"+getScores.getValue()); 
      }else if(scores.get(1).equals(getScores.getValue())){ 
       getScores.setValue(scores.get(0)); 
       System.out.println(getScores.getKey().getTeamName()+":"+getScores.getValue()); 
      } 
     } 

    } 

S'il y a un moyen plus court de le faire s'il vous plaît faites le moi savoir.

Encore merci à tous!

Questions connexes