Java 如何在HashMap中移动值

Java 如何在HashMap中移动值,java,Java,我有课,比如说曲棍球。曲棍球课将设置曲棍球得分,如下代码所示: public class Hockey{ private HashMap<String, Integer> hockeyScore; public Hockey(){ hockeyScore = new HashMap<String, Integer>(); } public void setHockeyScore(String clubName, int score){

我有课,比如说曲棍球。曲棍球课将设置曲棍球得分,如下代码所示:

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);  
  }
}
公共级曲棍球{
私人HashMap曲棍球得分;
公共曲棍球{
hockeyScore=newhashmap();
}
public void setHockeyScore(字符串clubName,int score){
曲棍球得分。推杆(俱乐部名称,得分);
}
}
一场曲棍球比赛只有两个队和两个分数,可以交换分数吗? 例如,当我们插入hashmap时,它会显示键和值

a队=23

b队=10

然后交换hashmap中的值,如下所示

a队=10

b队=23


对不起,伙计们,我想知道是否有一种类似于交换分数的方法,而不用手动使用“a”和“b”引用。就像在hashmap中插入任何键和值一样,此方法将交换周围的值。

当然,传统交换值的方式是:

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

您可以使用以下一行代码交换
Map
条目:

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

我很难想象为什么要这样做,但这只在有两个条目的映射中才可能实现——否则,交换就没有意义了

我的Java有点生疏,我不打算退出Eclipse只是为了检查语法,但类似的东西应该可以帮你完成这项工作:

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;
}
地图交换(字符串键1、字符串键2、地图m){
Map dummy=newhashmap();
虚拟放置(键2,m.get(键1));
虚拟放置(键1,m.get(键2));
返回假人;
}
如果您更雄心勃勃,您可以迭代条目以获取密钥,而不必让它们可用

Integer aScore = hockeyScore.get("a");
hockeyScore.put("a", map.get("b"));
hockeyScore.put("b", aScore);
和线程安全变体

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

非常感谢你的帮助

我已经想出办法交换hashmap中的值。首先,我收集分数并将其放入arraylist,然后将arraylist与hashmap进行比较,并根据arraylist重新设置hashmap

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());
            }
        }

    }
public void swapScores(){
对于(Map.Entry 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());
}
}
}
如果有较短的方法,请让我知道


再次感谢大家

使用
String[2]
int[2]
并在数组中交换。仅对两个条目使用HashMap有点过火。您可以创建一个类,例如ScoreResult,保存名称和结果,或者在两个变量中创建两个实例,或者创建一个包含两个条目的此类数组。哦,是的,即使使用完整的
concurrentMap
,也完全不可能实现原子化。仍然不是线程安全的。如果除了交换之外还有人在修改你的地图,锁将无法正确共享。然而,这是有点争议的,因为不清楚在threadsafety下应该首选的不变量是什么,但是是的,所有类型的离题,很可能OP现在没有这个问题。当然,你不会发布hockeyScore地图(如果你想要它threadsafe)!所有对地图的访问必须同步,每次读取,每次写入!