[英]How to retrieve a key based on the value in Map Interface Java?
我目前正在研究數據結構,以編寫有關名稱加密和解密的程序。 我對Map界面有疑問。 實際上,要獲取與鍵關聯的值,我們在Map接口中具有get()方法。 但是,如何在不迭代Map接口中所有鍵值對的情況下檢索特定值的鍵
謝謝
如何檢索特定值的鍵而不迭代Map界面中的所有鍵值對
鍵是鍵,而不是值 。 你做不到。 那不是Map的實現方式。
即使您使用某種魔術方法( 多次迭代,檢查是否有equal等.. ),也不能保證得到預期的結果。
根據Map的定義,Key是唯一的,而不是值。 因此,會有重復的值,當您按值獲取時,您期望獲得哪個關聯的鍵?
如果您確定沒有重復項,則可以
for (Entry<Integer, String> entry : testMap.entrySet()) {
if (entry.getValue().equals("c")) {
System.out.println(entry.getKey());
}
}
鑒於值是唯一的,您可以這樣:
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
接口及其實現不支持此功能。
考慮使用BiMap
例如在Google Guava Collections中灌裝的BiMap。 它在鍵和值之間建立一對一(雙向)關系。 https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap
使用BiMap
您可以使用Key key = biMap.inverse().get(value)
來獲取給定值的鍵。
您不能這樣做,因為“值”可以重復。
就像每個人都說的那樣,您不可能真正做到體面的方式,因為可能存在重復的值。 您可以使用equals()方法搜索匹配並比較值。 但是再說一次,如果您想這樣做,為什么還要使用鍵/值映射呢?
簡而言之,您可以編寫自己的get方法版本,並獲取要獲取的value對象的實例。 但是,如果要這樣做,使用地圖確實沒有意義。
為什么不使用一些您想要搜索價值的清單?
如前所述,這不是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);
但是,此選項需要您維護兩張地圖,有時這有時很難看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.