2015-05-14 68 views
1

我有一個名爲prizeWinners的哈希映射。哈希映射中每個對的關鍵是獲得諾貝爾獎的那一年。價值是獲獎者的名字。該值是一串字符串,因爲在任何給定的獎勵年中,可以有多達3個獲勝者。我的問題是:鑑於獲勝者的名字,請返回他們獲獎的年份。有趣的是,返回值還需要是一個字符串:public String getYearWon(String name),其中name是獲勝者的名字。Java Hashmap:從給定值的數組中獲取密鑰

public class NobelPrizeWinners 
{ 
    private HashMap<Integer, String[]> prizeWinners; 

    public NobelPrizeWinners 
    { 
     prizeWinners = new HashMap<Interger, String[]>(); 
     prizeWinners.put(2009, new String[] {"Barack H. Obama"}); 
     prizeWinners.put(2008, new String[] {"Martti Ahtisaari"}; 
     prizeWinners.put(2007, new String[] {"IAEA", "Mohamed ElBaradei"}); 
     //and many more 
    } 

    public String getYearWon(String name) 
    { 
     //code here 
    } 
} 

而這就是我卡住的地方:我似乎無法正確訪問數組來遍歷它並獲得密鑰。在我的任務中有幾種方法要求我這樣做(例如,打印出所有獲獎者的姓名),但我只獲取hashmap地址,而不是數組本身的內容。

+3

選中此:http://stackoverflow.com/questions/1066589/iterate-through-a-hashmap。值是數組,因此,當您在其中一個數組中找到您的名稱時,將返回鍵爲String:key.toString()。 –

+0

我知道你正在做這個作業。當您開始處理自己的項目時,可以使用'multimap'存儲這種類型的數據(其中一個鍵可以映射到多個值)。 Guava提供了一些[很好的實現](https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap)。 – dnault

回答

1

通過獎得主密鑰(年)的迭代。對於每一年,獲得贏家字符串數組並將其轉換爲列表,然後調用contains方法來查看獲勝者列表是否包含作爲參數傳遞的贏家名稱。如果是這樣的話,我們停止循環,並以String形式返回一年。如果我們經歷了所有這些年,但沒有找到贏家的名字,我們將返回null

private HashMap<Integer, String[]> prizeWinners; 

public PartsPortlet() 
{ 
    prizeWinners = new HashMap<Integer, String[]>(); 
    prizeWinners.put(2009, new String[]{"Barack H. Obama"}); 
    prizeWinners.put(2008, new String[]{"Martti Ahtisaari"}; 
    prizeWinners.put(2007, new String[]{"IAEA", "Mohamed ElBaradei"}); 
    //and many more 
} 

public String getYearWon(String name) { 
    for (int year : prizeWinners.keySet()) { 
     if (Arrays.asList(prizeWinners.get(year)).contains(name)) { 
      return String.valueOf(year); 
     } 
    } 
    return null; 
} 
+0

謝謝,這工作得很好。但是,我的班級尚未使用數組實用程序。雖然檢查它,但它非常整齊地解決了我的許多問題。 –

+1

太棒了!隨時將答案標記爲已接受。 –