从Key获取价值,价值是一个清单

时间:2015-10-03 15:19:27

标签: java list hashmap

我如何从我的价值中获得钥匙?

我的HashMap:

public static final Map<String, List<String>> Server = new HashMap<>();

我的尝试:

  public static Object getKeyFromValue(String value) {
        for (Object o : Server.keySet()) {
             if (Server.get(o).equals(value)) {
                 return o;
             }
         }
         return null;
   }

它很有效,因为值是一个列表。

3 个答案:

答案 0 :(得分:1)

使用List#contains

if (Server.get(o).contains(value)) {
    //...
}

答案 1 :(得分:0)

当您对Map进行迭代时,如果您需要密钥和值,则最好迭代entrySet而不是keySet

public static String getKeyFromValue(String value) {
    for (Map.Entry<String, List<String>> e : Server.entrySet()) {
        if (e.getValue().contains(value)) {
            return e.getKey();
        }
    }
    return null;
}

这应该有效,但有三件事我不喜欢(除了Server以大写字母开头)。

    许多contains实施(包括ListArrayList)的
  1. LinkedList速度很慢,因为它是线性搜索。最好使用HashSet代替。
  2. 如果value出现在地图中的多个列表中,则返回的密钥可以是多个答案中的任何一个。方法的名称可能更好地表明这一点(例如getAnyKeyForValue)。
  3. 最好返回Optional<String>而不是使用null表示未找到该值。
  4. Java 8解决方案,考虑所有这些要点并利用并行性将是

    public static Optional<String> getAnyKeyForValue(String value) {
        return Server.entrySet()
                     .parallelStream()
                     .filter(e->e.getValue().contains(value))
                     .map(Map.Entry::getKey)
                     .findAny();
    }
    

答案 2 :(得分:0)

从等于改变包含作品。并且所有都保持不变

public static Object getKeyFromValue(String value) {
    for (Object o : Server.keySet()) {
        if (Server.get(o).contains(value)) {
             return o;
         }
     }
     return null;
}