如何根据Map Interface Java中的值检索密钥?

时间:2015-09-22 07:59:50

标签: java

我目前正致力于Data Structures编写有关名称加密和解密的程序。我对Map界面有疑问。实际上为了获得与键相关联的值,我们在Map接口中有get()方法。但是如何在不迭代Map接口

中的所有键值对的情况下检索特定值的键

谢谢

6 个答案:

答案 0 :(得分:2)

  

如何在不迭代Map接口

中的所有键值对的情况下检索特定值的键

键是键,而不是值。你做不了。那不是Map的实现方式。

即使你用一些魔法(迭代多次,检查equls等...... ),它也不能保证给出预期的结果..

根据Map的定义,Key是唯一的而不是值。所以会有重复的值,当你按价值获得时,你会得到哪个相关的密钥?

如果您确定没有重复项,则可以

 for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }

答案 1 :(得分:2)

鉴于值是唯一的,你可以这样:

    Map<String, String> map = new HashMap<>();
    map.put("key1", "value1");
    map.put("key2", "value2");

    String key = map.entrySet().stream().
    collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey))
    .get("value1");

    System.out.println(key); //gives key1

答案 2 :(得分:1)

正如其他人所说,不可能做到。 Map接口及其实现不支持此功能。

考虑使用BiMap,例如Google Guava Collections中包含的BiMap。它在键和值之间建立一对一(双向)关系。 https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap

使用Key key = biMap.inverse().get(value),您可以使用super.onBackPressed();获取给定值的密钥。

答案 3 :(得分:0)

你不能这样做,因为“价值”可以重复。

答案 4 :(得分:0)

好像每个人都说,你不能以一种体面的方式真正做到这一点,因为可能存在重复的值。您可以使用equals()方法搜索匹配并比较值。但话又说回来,如果你想做这样的事情,为什么你甚至使用键/值图。

简而言之,您可以编写自己的get方法版本,接受您想要获取的值对象的实例。但是如果要这样做,那么使用地图确实没有意义。

为什么不使用某些你希望搜索价值的列表?

答案 5 :(得分:0)

如上所述,这不是由Java-Map接口提供的,因为你应该有一个密钥然后获取值。

通常你有类似的东西。

User user = ...;
HashMap<String, User> usernamesToUser = ...

然后你可以通过以下方式获得密钥:

String username = user.getUsername();

所以实际上没有使用地图。 但是,您可以做的是,如果不直接从对象检索关键字,则可以在两个方向上使用两个地图。因此,请考虑前一个示例(假设用户User对象不安全用户名)

Map<User, String> userMapReverse = ....;
Map<String, User> userMap = ....;
String username = userMapReverse.get(user);

但是这个选项需要你维护两张地图,有时可能会非常难看。