Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
341 views
in Technique[技术] by (71.8m points)

java - Java Hashmap:如何从价值中获取关键?(Java Hashmap: How to get key from value?)

If I have the value "foo" , and a HashMap<String> ftw for which ftw.containsValue("foo") returns true , how can I get the corresponding key?

(如果我的值是"foo" ,并且ftw.containsValue("foo")返回trueHashMap<String> ftw ,如何获得相应的键?)

Do I have to loop through the hashmap?

(我是否必须遍历哈希图?)

What is the best way to do that?

(最好的方法是什么?)

  ask by Nick Heiner translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

If your data structure has many-to-one mapping between keys and values you should iterate over entries and pick all suitable keys:

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

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;
}

In case of one-to-one relationship, you can return the first matched key:

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

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;
}

In Java 8:

(在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());
}

Also, for Guava users, BiMap may be useful.

(同样,对于Guava用户, BiMap可能会有用。)

For example:

(例如:)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...