Java Hashmap:如何从价值中获取密钥?

如果我的值为"foo" ,并且ftw.containsValue("foo")返回trueHashMap<String> ftw ,我怎样才能获得相应的键? 我必须循环散列图吗? 什么是最好的方式来做到这一点?


如果您选择使用Commons Collections库而不是标准Java Collections API,则可以轻松实现此目的。

在类别库中的接口BidiMap是双向地图,允许你映射一键的值(如正常的地图),以及映射的值的键,从而使你在两个方向上执行查找。 getKey()方法支持获取值的键。

但有一点需要注意,双向映射不能将多个值映射到键,因此除非您的数据集在键和值之间具有1:1映射,否则不能使用bidimaps。

更新

如果您想依赖Java Collections API,则必须在将值插入到映射时确保键和值之间的1:1关系。 说起来容易做起来难。

一旦可以确保,使用entrySet()方法获取Map中的一组条目(映射)。 获得类型为Map.Entry的集合后,遍历条目,将存储的值与期望值进行比较,并获取相应的密钥。

更新#2

在Google Guava和重构的Commons-Collections库(后者不是Apache项目)中可以找到对泛型地图的支持。 感谢Esko指出Apache Commons Collections中缺少的通用支持。 使用带泛型的集合可以实现更多可维护的代码。


如果您的数据结构在键和值之间具有多对一的映射,您应该遍历条目并选择所有合适的键:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    Set<T> keys = new HashSet<T>();
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            keys.add(entry.getKey());
        }
    }
    return keys;
}

如果是一对一关系,则可以返回第一个匹配的键:

public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

在Java 8中:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getValue(), value))
              .map(Map.Entry::getKey)
              .collect(Collectors.toSet());
}

另外,对于Guava用户,BiMap可能会有用。 例如:

BiMap<Token, Character> tokenToChar = 
    ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '(');
Token token = tokenToChar.inverse().get('(');
Character c = tokenToChar.get(token);

public class NewClass1 {

    public static void main(String[] args) {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }
    }
}

一些额外的信息...可能对你有用

如果你的hashmap真的很大,上面的方法可能不太好。 如果你的hashmap包含唯一键映射的唯一键,你可以再维护一个包含从Value到Key的映射的hashmap。

那就是你必须保持两个hashmaps

1. Key to value

2. Value to key 

在这种情况下,你可以使用第二个hashmap来获得密钥。

链接地址: http://www.djcxy.com/p/6289.html

上一篇: Java Hashmap: How to get key from value?

下一篇: Why Calendar.SEPTEMBER is not working?