我目前正在研究数据结构,以便编写一个关于名称加密和解密的程序。我对地图界面有疑问。实际上,为了获取与键相关的值,我们在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);
但是这个选项需要维护两个映射,这有时会很难看。