[英]Java: How to properly remove a value from a HashMap NOT based on the key
[英]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.