【问题标题】:How to create a method to get the Key of a value(string) in a hashmap如何创建一种方法来获取哈希图中的值(字符串)的键
【发布时间】:2011-06-29 09:00:07
【问题描述】:

我有一个作业,这是我的 HashMap 初始化。我只能使用标准的 JAVA API。

private static HashMap<String, HashSet<String>> hMap = new HashMap<String, HashSet<String>>();

是否可以获取指定值的键,例如 getkey(hMap,"today"),它会返回今天所在的键..

还有没有办法在我的 HashSet 中获取 Key 的最后一个值?

感谢任何帮助!

【问题讨论】:

  • 如果多个键映射到相同的值,getKey 的预期行为是什么?您似乎隐含地假设映射是单射的(或一对一的)。
  • 从您的问题和您的一些 cmets 来看,您似乎要求许多不同的东西。整理您的想法并在您的问题中更具体。

标签: java hashmap hashset


【解决方案1】:

但实际上您可以拥有多个具有“今天”的键。所以我用键返回 List.toString

private static HashMap<String, HashSet<String>> hMap = new HashMap<String, HashSet<String>>();

public static String getKey(Map<String, HashSet<String>> map, String value) {
    List<String> returnKey = new ArrayList<String>();

    for (String s : map.keySet()) {
        if (map.get(s).contains(value)) {
            returnKey.add(s);
        }
    }

    return returnKey.toString();

}

public static void main(String[] args) {
    // put sth to hMap
    System.out.println(getKey(hMap, "today"));
}

【讨论】:

    【解决方案2】:

    你真正想要的是Google's Guava BiMap。

    双映射(或“双向映射”)是一种映射,它保留其值的唯一性以及其键的唯一性。此约束使 bimap 能够支持“反向视图”,这是另一个 bimap,包含与此 bimap 相同的条目,但具有相反的键和值。

    如果你不能使用它,那么你将不得不循环遍历地图条目以寻找不太快速的匹配项。

    【讨论】:

    • 我不允许使用外部库 :(
    • @eNetik:那是作业吗?无论哪种方式,您都需要更新您的问题以包含此类限制。
    • @eNetik - 即使是像 Guava 库一样获得 Apache 许可的?它允许商业和非商业开发
    【解决方案3】:

    尽可能笼统地使用Map。

    public static <K,V> K getKey(Map<K,V> map,V val){
        for(Map.Entry<K,V> entry:map.entrySet()){
            if(entry.getValue().equals(val)){
                return entry.getKey();
            }
        }
        return null;
    }
    

    这只会返回匹配的第一个值的键。如果要返回特定值的所有键,则可以修改此方法以将它们的键累积到 List 并返回。

    (不要对快速检索抱有希望...)

    【讨论】:

    • 该方法由于某种原因不接受 (map , stringvalue)
    • 它将接受您地图中的V。根据您问题中的代码HashSet&lt;String&gt;。编译:Integer key=getKey(new HashMap&lt;Integer,String&gt;(),"foo");
    • 我的密钥是一个字符串但是.. String key=getKey(new HashMap(),"foo");不编译:/如果我将 K 更改为 String 并在 entry.getKey() 上转换 String;那行得通吗?
    • 第二个参数代表地图的值。在我的示例中,值是String。他们的key是Integer。在您的示例中,value 是 HashSet。我的回答只回答你的第一个问题。返回时由您来迭代HashSet。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2015-04-22
    相关资源
    最近更新 更多