我目前正致力于Data Structures编写有关名称加密和解密的程序。我对Map界面有疑问。实际上为了获得与键相关联的值,我们在Map接口中有get()方法。但是如何在不迭代Map接口
中的所有键值对的情况下检索特定值的键谢谢
答案 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);
但是这个选项需要你维护两张地图,有时可能会非常难看。