如何根据Map Interface Java中的值检索键



我目前正在研究数据结构,以便编写一个关于名称加密和解密的程序。我对地图界面有疑问。实际上,为了获取与键相关的值,我们在Map接口中使用get()方法。但是如何在不遍历Map接口

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

谢谢

正如其他人所说,这是不可能的。Map接口及其实现不支持这一点。

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

使用BiMap,您可以使用Key key = biMap.inverse().get(value)来获取给定值的键。

给定值是唯一的,您可以像这样设置它:

    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

如何检索特定值的键而不遍历Map接口

中的所有键值对

Key是Key,而不是值。你不能这么做。这不是Map的实现方式。

即使你使用了一些魔法(多次迭代,检查是否相等等),也不能保证得到预期的结果…

根据Map的定义,Key是唯一的而不是值。因此,将会有重复的值,当您按值获取时,您希望获得哪个关联键?

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

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

就像每个人说的,你不能用一种体面的方式来做,因为可能会有重复的值。您可以使用equals()方法搜索命中并比较值。但话说回来,如果你想这样做,为什么还要使用键/值映射呢?

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

你不能这样做,因为"values"可以被复制。

如前所述,Java-Map接口不提供此功能,因为您应该有一个键,然后获取该值。

通常是这样的。

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

然后你可以像这样得到键:

String username = user.getUsername();

不使用映射。但是,您可以做的是,如果键不是直接从对象中检索,您可以为两个方向使用两个map。所以考虑前一个例子(假设User User对象不保护用户名)

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

但是这个选项需要维护两个映射,这有时会很难看。

最新更新