如何在映射接口Java中基于值检索密钥?

如何在映射接口Java中基于值检索密钥?,java,Java,我目前正在研究数据结构,以便编写一个关于姓名加密和解密的程序。我对地图界面有疑问。实际上,为了获取与键关联的值,我们在Map接口中使用了get()方法。但是如何在不遍历Map接口中的所有键值对的情况下检索特定值的键呢 谢谢您不能这样做,因为“值”可以复制 如何在不遍历Map接口中的所有键值对的情况下检索特定值的键 键是键,而不是值。你不能这样做。Map不是这样实现的 即使你用了一些魔法(多次迭代,检查等式等等),也不能保证得到预期的结果 根据Map的定义,Key是惟一的,而不是值。所以会有重复的

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


谢谢

您不能这样做,因为“值”可以复制

如何在不遍历Map接口中的所有键值对的情况下检索特定值的键

键是键,而不是值。你不能这样做。Map不是这样实现的

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

根据Map的定义,Key是惟一的,而不是值。所以会有重复的值,当您按值获取时,您希望得到哪个关联键

如果您确定没有重复项,您可以这样做

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

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

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


为什么不列出一些你希望搜索价值的人呢?

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

考虑使用
BiMap
,比如谷歌番石榴系列中的BiMap。它在键和值之间建立一对一(双向)关系。


使用
BiMap
可以使用
Key Key=BiMap.inverse().get(value)
为给定的值获取一个键。

如上所述,这不是Java映射接口提供的,因为您应该拥有一个键,然后获取值

通常你有这样的东西

User user = ...;
HashMap<String, User> usernamesToUser = ...
所以实际上不用地图。 但是,您可以做的是,如果关键点不是直接从对象中检索,则可以对两个方向使用两个贴图。因此,考虑前一个例子(假设用户用户对象不安全用户名)

MapUserMapReverse=。。。。;
Map userMap=。。。。;
字符串username=userMapReverse.get(用户);

但是,此选项要求您维护两个贴图,这有时可能非常难看。

鉴于值是唯一的,您可以这样对其进行修改:

    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 Map=newhashmap();
地图放置(“键1”、“值1”);
地图放置(“键2”、“值2”);
String key=map.entrySet().stream()。
collect(Collectors.toMap(Map.Entry::getValue,Map.Entry::getKey))
.获取(“价值1”);
系统输出打印项次(键)//给出键1

有人能给我推荐一种数据结构,通过它我可以解决我的问题吗?实际上,我已经尝试过使用输入界面,但我不明白您到底想做什么?也可以尝试
收集器。groupingBy
可以为您提供与每个值关联的键列表。谢谢,是的,我可以,但我需要键和值。加密过程的值和解密过程的密钥。那么,你能给我推荐一些数据结构吗?通过这些数据结构,可以解决这个问题。
加密过程的值和解密过程的密钥。
-你为什么不维护一个普通的映射呢?@Srividya好吧,如果你真的找不到你想要使用的数据结构,没有任何内容阻止您创建包含所有所需数据的对象:)。您可以创建自己的容器类,并将其存储在集合(例如arraylist)中,然后访问所需的所有成员。但您应该记住,您需要一种独特的方法来识别对象。在地图上,这通常是关键。
Map<User, String> userMapReverse = ....;
Map<String, User> userMap = ....;
String username = userMapReverse.get(user);
    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