2012-11-28 49 views
1

我在改變HashMap>中的值時遇到問題。首先我這樣做:java更新hashmap

HashMap<String, ArrayList<Integer>> countries = new HashMap<>(); 
ArrayList<Integer> medals = new ArrayList<>(); 
medals.add(0); medals.add(0); medals.add(0); 
for(int i = 0; i < COUNTRY.length; i++){ 
    countries.put(COUNTRY[i], medals); 
} 

我填從一個靜態數組連鍵HashMap中,並添加填充有0的ArrayList,0的一個默認值,0。然後我這樣做:

Integer plus = new Integer(1); 
for(int j = 0; j < athletes.size(); j++){ 
    if(j == 3) 
     break; 
    Athlete a = athletes.get(j); 
    ArrayList<Integer> medals = countries.get(a.getCountry()); 
    Integer medal = medals.get(j) + plus; 
    medals.set(j, medal); 
    countries.put(a.getCountry(), medals); 
} 

我有一個ArrayList,裏面充滿了運動員,這些運動員已經根據運動員的結果進行了排序。我想要做的是拿到排名前3的運動員,並更新我的HashMap值,以便ArrayList將有3個數字,代表每個國家贏得多少金牌,銀牌和銅牌。 問題是,當我嘗試用新的ArrayList替換舊值時,它用新的ArrayList替換了HashMap中的所有值,而不是僅使用匹配鍵的值。

我不知道是什麼問題,有什麼建議?

回答

7

的問題是在這一段代碼:

HashMap<String, ArrayList<Integer>> countries = new HashMap<>(); 
ArrayList<Integer> medals = new ArrayList<>(); 
medals.add(0); medals.add(0); medals.add(0); 
for(int i = 0; i < COUNTRY.length; i++){ 
    countries.put(COUNTRY[i], medals); 
} 

您只需創建列表的一個實例,並將它與每個國家相關聯。

可能的解決方法是在每個循環迭代中初始化一個新的List。

HashMap<String, List<Integer>> countries = new HashMap<>(); 
for(int i = 0; i < COUNTRY.length; i++){ 
    List<Integer> medals = Arrays.asList(0, 0, 0); 
    countries.put(COUNTRY[i], medals); 
} 

如果你的列表中包含了3個固定大小,你爲什麼不使用一個簡單的int[]呢?

這是代碼看起來如何使用int[]

Map<String, int[]> countries = new HashMap<>(); 
for(int i = 0; i < COUNTRY.length; i++){ 
    countries.put(COUNTRY[i], new int[3]); 
} 
// 
for(int j = 0; j < athletes.size(); j++){ 
    if(j == 3) 
     break; 
    Athlete a = athletes.get(j); 
    int[] medals = countries.get(a.getCountry()); 
    medals[j]++; 
    // last to lines could even be 
    // countries.get(a.getCountry())[j]++; 
} 
+0

謝謝你,我應該知道我犯了一個愚蠢的錯誤:P 和是的我猜int []更簡單:) – zkranc

+0

我對這個問題掙扎於SO LONG,這是簡單的修復。非常感謝! – maia

0

你應該使用谷歌,番石榴的MultiMap。它正是針對這種情況設計的,您需要Map<K,List<V>>結構類型。即相同密鑰的多個值。