hashmap返回键和值方法提供不正确的输出

时间:2014-02-20 19:44:23

标签: java hashmap set

我想创建返回相同名字和姓氏数量的方法,但是当我尝试测试和编译代码时,我得到输出1,1,这不是真的。因为有10个相同的名字和10个相同的姓氏。

public class Solution
{
    public static void main(String[] args)
    {
        HashMap<String, String> map = createMap();
        System.out.println(getCountTheSameFirstName(map, "test"));
        System.out.println(getCountTheSameLastName(map, "test"));
    }
    public static HashMap<String, String> createMap()
    {
        HashMap<String, String> odin = new HashMap<String, String>();
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");
        odin.put("test","test");

         return odin;
    }

    public static int getCountTheSameFirstName(HashMap<String, String> map, String name)
    {
        int count = 0;
        for(Map.Entry<String, String> lol : map.entrySet()){

        String value = lol.getValue();
            if(name.equals(value)){
                count++;
            }
    }
        return count;
    }

    public static int getCountTheSameLastName(HashMap<String, String> map, String familiy)
    {
        int count=0;
        for (Map.Entry<String,String> pair : map.entrySet())
        {
            String key = pair.getKey();
            if (familiy.equals(key))
            {
                count++;
            }
        }
        return count;
    }
}

4 个答案:

答案 0 :(得分:2)

请参阅HashMap - API,根据定义它是正确的:“将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。 “ (http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#put(K,V))

答案 1 :(得分:1)

您正在插入相同的密钥10次。第一个put可以正常工作,但每个后续put都会使用相同的映射替换旧的键/值映射。最终结果是Map中只有一个键/值对,因此您将1作为输出。

答案 2 :(得分:1)

简而言之:您的方法在设计HashMap时有效 - 您使用相同的键强制放入HashMap并首次向map添加值,并且您只需更改此元素的值,因为它有同样的关键。

说明

您遇到这种情况 - 您创建了HashMap:

HashMap<String, String> odin = new HashMap<String, String>();

有第一个字符串键和第二个字符串值。使用line:

添加值时
odin.put("test","test");

您是关键测试的设定值测试。

如果重复这一点,您将使用带有键测试的新元素

更改带有键测试的旧元素

结果是输入的值被替换。

而不是这个,你必须使用唯一键放入HashMap其他东西(例如数组)。在这种情况下,您可以拥有10个具有相同值的输入。

以下是此HashMap的示例:

HashMap<String, String[]> odin = new HashMap<String, String[]>();

在这种情况下,你必须提供字符串键和字符串数组,其中包含值(问题中的名字和姓氏)。

答案 3 :(得分:1)

对不起!!如果你不使用重复键,那么你必须得到输出10&amp; 0

你的代码:我刚改变了密钥,得到了输出10&amp; 0:

public class Solution
{
    public static void main(String[] args)
    {
        HashMap<String, String> map = createMap();
        System.out.println(getCountTheSameFirstName(map, "test"));
        System.out.println(getCountTheSameLastName(map, "test"));
    }
    public static HashMap<String, String> createMap()
    {
        HashMap<String, String> odin = new HashMap<String, String>();
        odin.put("0","test");
        odin.put("1","test");
        odin.put("2","test");
        odin.put("3","test");
        odin.put("4","test");
        odin.put("5","test");
        odin.put("6","test");
        odin.put("7","test");
        odin.put("8","test");
        odin.put("9","test");

        return odin;
    }

    public static int getCountTheSameFirstName(HashMap<String, String> map, String name)
    {
        int count = 0;
        for(Map.Entry<String, String> lol : map.entrySet()){

            String value = lol.getValue();
            if(name.equals(value)){
                count++;
            }
        }
        return count;
    }

    public static int getCountTheSameLastName(HashMap<String, String> map, String familiy)
    {
        int count=0;
        for (Map.Entry<String,String> pair : map.entrySet())
        {
            String key = pair.getKey();
            if (familiy.equals(key))
            {
                count++;
            }
        }
        return count;
    }
}