【问题标题】:Get key from a HashMap using the value [duplicate]使用值从HashMap中获取键[重复]
【发布时间】:2011-12-28 02:49:40
【问题描述】:

我想使用 value 获取 HashMap 的 key。

hashmap = new HashMap<String, Object>();

haspmap.put("one", 100);
haspmap.put("two", 200);

这意味着我想要一个取值 100 并返回字符串 1 的函数。

这里似乎有很多问题都在问同样的问题,但它们对我不起作用。

也许是因为我是 java 新手。

怎么做?

【问题讨论】:

  • 100 是值而不是键。你要么必须交换“一”和 100 等等,要么你需要一个 BiMap。第一个参数是键,第二个参数是值。
  • @Fatal 下次提供这个作为答案;)你比我快 10 秒。
  • @Bozho 下次我会这样做。 :-)

标签: java collections hashmap


【解决方案1】:

HashMap中的put方法是这样定义的:

Object  put(Object key, Object value) 

key 是第一个参数,所以在你的说法中,“one”是关键。在 HashMap 中按值查找并不容易,如果您真的想这样做,可以通过调用 entrySet() 进行线性搜索,如下所示:

for (Map.Entry<Object, Object> e : hashmap.entrySet()) {
    Object key = e.getKey();
    Object value = e.getValue();
}

然而,这是 O(n) 并且有点违背了使用 HashMap 的目的,除非你只需要很少这样做。如果您真的希望能够频繁地通过键或值进行查找,那么核心 Java 对您没有任何帮助,但是您想要的是来自 Google Collections 的 BiMap。

【讨论】:

  • 这只会在调试时运行,所以运行时间不是问题。
  • +1,虽然我发现迭代条目集更简单一些,因为它包含元素中的值。尽管如此,如果没有 BiMap,OP 需要在地图之外保持“唯一值”不变。
  • @MarkPeters:谢谢。我本来想那样做的,但我的手指不配合。 entrySet 效率更高,因为您不需要对 keySet 的每次迭代进行查找。
  • 它就像一个魅力。谢谢。
【解决方案2】:

我们可以从VALUE 得到KEY。下面是一个示例代码_

 public class Main {
  public static void main(String[] args) {
    Map map = new HashMap();
    map.put("key_1","one");
    map.put("key_2","two");
    map.put("key_3","three");
    map.put("key_4","four");
System.out.println(getKeyFromValue(map,"four")); } public static Object getKeyFromValue(Map hm, Object value) { for (Object o : hm.keySet()) { if (hm.get(o).equals(value)) { return o; } } return null; } }

希望对大家有所帮助。

【讨论】:

  • 这比公认的答案要好。
  • 绝妙的小方法 - 满足了我的需求 - 我想在未来几年里我会好好利用这个例子。
【解决方案3】:
  • 如果您只需要,只需使用put(100, "one")。请注意,键是第一个参数,值是第二个。
  • 如果您需要能够同时通过键和值获取,请使用BiMap(来自 guava)

【讨论】:

    【解决方案4】:

    你把它颠倒了。 100 应该是第一个参数(它是键),“one”应该是第二个参数(它是值)。

    阅读 HashMap 的 javadoc,这可能会对您有所帮助:HashMap

    要获取值,请使用hashmap.get(100)

    【讨论】:

    • 操作我把它写反了。我会解决的。
    【解决方案5】:

    您混合了键和值。

    Hashmap <Integer,String> hashmap = new HashMap<Integer, String>();
    
    hashmap.put(100, "one");
    hashmap.put(200, "two");
    

    之后

    hashmap.get(100);
    

    会给你“一个”

    【讨论】:

    • 不知道为什么你被否决了......这似乎是 OP 的一个似是而非的错误。 @AHungerArtist 甚至说他在下面的 cmets 中反转了它。
    【解决方案6】:

    如果你通过付出 100 来获得“ONE”,那么

    通过

    初始化哈希映射

    hashmap = new HashMap&lt;Object,String&gt;();

    haspmap.put(100,"one");

    并通过以下方式检索值 hashMap.get(100)

    希望有帮助。

    【讨论】:

    • 并不是因为我这样制作这张地图是为了提供字符串并返回值。现在我需要进行相反的调试。
    【解决方案7】:
    public class Class1 {
    private String extref="MY";
    
    public String getExtref() {
        return extref;
    }
    
    public String setExtref(String extref) {
        return this.extref = extref;
    }
    
    public static void main(String[] args) {
    
        Class1 obj=new Class1();
        String value=obj.setExtref("AFF");
        int returnedValue=getMethod(value);     
        System.out.println(returnedValue);
    }
    
    /**
     * @param value
     * @return
     */
    private static int getMethod(String value) {
          HashMap<Integer, String> hashmap1 = new HashMap<Integer, String>();
            hashmap1.put(1,"MY");
            hashmap1.put(2,"AFF");
    
            if (hashmap1.containsValue(value))
            {
                for (Map.Entry<Integer,String> e : hashmap1.entrySet()) {
                    Integer key = e.getKey();
                    Object value2 = e.getValue();
                    if ((value2.toString()).equalsIgnoreCase(value))
                    {
                        return key;
                    }
                }
            }   
            return 0;
    
    }
    }
    

    【讨论】:

    • 仅仅代码不是答案。你必须解释。
    【解决方案8】:

    如果你不是一定要使用Hashmap,我建议使用pairfirstsecond 调用可以访问各个元素。

    看看这个http://www.cplusplus.com/reference/utility/pair/

    我在这里用过:http://codeforces.com/contest/507/submission/9531943

    【讨论】:

    • 问题是关于 Java,而不是 C++。
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2010-11-25
    • 2016-03-08
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多