簡體   English   中英

如何基於Map Interface Java中的值檢索鍵?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM