繁体   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