【问题标题】:Get Key from a specified Value in HashMap从HashMap中的指定值获取Key
【发布时间】:2016-07-09 04:00:31
【问题描述】:

我有一个 HashMap “stateCityMap”,它是一个 Map>。键是州,即果阿、喀拉拉邦等,值是城市,即 Panjim、Margao 等。我想检查 HashMap 中是否存在特定城市,例如 Margao,并给出该值的相应键作为结果..但是每次我运行下面的代码时,它都会执行else部分(当HashMAp中不存在城市时)。 city :- 是我传递给这个函数的城市名称

代码:

  public String getState(Map<String, List<String>> stateCityMap, String city) throws CityNotFoundException {


    HashMap<String, List<String>> g = new HashMap<String, List<String>>(stateCityMap);

    if(g.containsValue(city)){

        System.out.println("State:- " +g.get(city));

    }
    else {
        throw new CityNotFoundException("City Not Found");
        }

    return null;
}

为什么要这样做?为什么我得到错误的结果?

【问题讨论】:

  • 您想要的数据结构类似于 BiMultiMap 或 MultiBiMap。有点异国情调。
  • 你的 Map 是从后到前的,或者你应该使用两个 Map,一个在 O(1) 时间内提供反函数,而不是这个 O(N ) 技术。
  • 比 O(N) 差; O(城市)+ O(州)。
  • @DavidEhrmann - 我不允许更改数据结构...有什么办法可以达到预期的效果吗?
  • @EJP --- 我必须使用此地图来执行我希望执行的任何操作。有什么办法可以达到预期的效果?

标签: java collections hashmap


【解决方案1】:

效率不高,但需要遍历地图中的每个列表:

public String getState(Map<String, List<String>> stateCityMap, String city) throws CityNotFoundException {
    for (Map.Entry<String, List<String>> entry : stateCityMap.entrySet()) {
        if (entry.getValue().contains(city)) {
            return entry.getKey();
        }
    }

    throw new CityNotFoundException("City Not Found");
}

【讨论】:

  • 只能遍历数组或 java.lang.iterable 的实例
  • 已修复。但实际上,这是一个错字,您可以自己调查。
【解决方案2】:

如果映射将一个或多个键映射到指定值,containsValue 方法返回 true。

在您的情况下,值的类型是 List,但您通过传递 String 来调用 containsValue 方法。所以它总是返回 false。

由于您的值类型是列表,因此您最终将迭代所有键和所有值以查找城市是否存在于任何列表中。

更好的是维护两张地图。挑战将是确保两个地图始终正确更新(插入、删除、更新)。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多