2012-11-21 24 views
3

我有課,可以說曲棍球。曲棍球類將設置曲棍球的比分像下面的代碼:如何在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); 
    } 
} 

曲棍球比賽只會有兩支球隊和兩個成績,是可以交換的成績嗎? 例如,當我們插入HashMap和它的鍵和值出來......

團隊 'A'= 23

隊 'B'= 10

那麼你交換價值在HashMap中,這將看起來像......

團隊 'A'= 10

team'b'= 23

對不起,我想知道是否有一種方法可以在不使用'a'和'b'參考的情況下交換分數。就像您將任何鍵和值插入散列映射中一樣,此方法將交換周圍的值。

+0

使用'String [2]'和'int [2]'並交換數組。 –

+0

對於只有兩個和兩個條目使用HashMap是有點矯枉過正的。你可以做一個班,例如。ScoreResult,保存名稱和結果,並在兩個變量中創建兩個實例,或者使用兩個條目創建這個類的數組。 – PhiLho

回答

1

你可以交換使用這一個班輪Map條目:

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

當然,你傳統的交換價值的方式:

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

必備「不是線程安全」評論。 – djechlin

+0

哦,是的,即使有一個完整的'concurrentMap',做原子是完全不可能的。 –

+0

不支持併發映射,但我的簡單代碼低於 – AlexWien

0

我無法想象,你爲什麼會想這樣做,但只有在有2個條目的Map的情況下才可能 - 否則,swap是沒有意義的。

我的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; 
} 

如果你是更加雄心勃勃,您可以迭代條目以獲取密鑰,而不必讓它們可用。

0
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); 
} 
+0

仍然不是線程安全的。如果除了交換之外的人正在修改你的地圖,鎖定將不會被正確共享。然而,這是有些爭議的,因爲它不清楚在線程安全性下什麼是不變量,但是是所有類型的偏離,現在OP可能沒有這種擔心。 – djechlin

+0

當然你不會發布hockeyScore地圖(如果你想要它threadsafe)!所有對地圖的訪問必須同步,每次讀取,每次寫入! – AlexWien

0

非常感謝您的幫助!

我已經想通了交換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()); 
      } 
     } 

    } 

如果有一個更短的方法來做到這一點,請讓我知道。

再次感謝大家!