簡體   English   中英

如何根據 Java 中的值從 HashMap 返回鍵

[英]How to return a Key from HashMap based on its Value in Java

考慮以下:

for (Boolean i: x.values()) {
    if (i == false) {
        return // KEY;
    }
}

在上面的代碼中,我試圖遍歷HashMap 當值為false時,我想返回一個Key

我該怎么做?

您需要遍歷 HashMap 的entrySet

for (Map.Entry<Object, Boolean> entry : x.entrySet()) {
   if(entry.getValue() == false){
        return entry.getKey();
    }
}

為了首先找到映射到特定值的鍵,您需要遍歷鍵集條目集

后一種選擇是首選,因為在每個迭代步驟中,您手頭都會有一個鍵值對 因此,它會比在每次迭代中查詢映射稍微快一些(余數:在真正的哈希映射中可能存在沖突,並且找到目標節點可能比訪問映射條目上的值花費更多時間)。

但是您絕對不能像在您發布的代碼片段中那樣使用由方法values()返回的地圖值集合。 當您手頭只有一個時,沒有快速檢索密鑰的方法。

在下面的示例中,將展示如何從與在運行時使用Stream API動態提供的條件( Predicate )匹配的任意類型的映射中獲取

有一件重要的事情需要考慮:目標值可能不會出現在地圖中。 並且代碼應該處理這種情況。 我們可以提供一個默認值(直接或通過Supplier ),拋出一個異常(如果根據應用程序邏輯,給定的值總是存在的),或者通過使用Optional提供的ifPresent()ifPresentOrElse()方法班級。 在下面的示例中,我選擇提供默認值。

查看這些教程以獲取有關lambda 表達式的更多信息

public static void main(String[] args) {
    Map<String, Boolean> sourceMap =
        Map.of("A", true, "B", false, "C", true);
    
    String result = getFirstKey(sourceMap, entry -> !entry.getValue(), "");
    System.out.println(result);
}

public static <K, V> K getFirstKey(Map<K, V> map,
                                   Predicate<Map.Entry<K, V>> condition,
                                   K defaultKey) {
    
    return map.entrySet().stream()
        .filter(condition)         // Stream<Map.Entry<K, V>>
        .findFirst()               // Optional<Map.Entry<K, V>>
        .map(Map.Entry::getKey)    // Optional<K>
        .orElse(defaultKey); // or apply .orElseThrow() depending on your needs
}

輸出

B // key assosiated with a value of `false`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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