2015-05-14 69 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

太棒了!随时将答案标记为已接受。 –