如何使用Value从HashMap中删除Key

时间:2018-05-08 13:58:54

标签: java hashmap

我的作业要求我配置一个配置的地图......

Map<Integer,Event> eventList = new HashMap<>();

我必须编写一个具有以下标题的方法......

public String removeEvent(Event eventObj)

我们的想法是将它传递给Event对象,检查事件是否已经作为Map中的值存在,如果存在,则将其删除并返回String消息,确认它已被删除。

我遇到的问题是它规定我不能在地图上迭代解决方案。

我可以使用containsValue()方法或覆盖的equals()方法来检查对象是否已经存在于地图中,但我现在遇到的问题是我不知道如何删除密钥对值匹配?

任何帮助都会很好,因为我对地图很陌生并经常在Key和Value之间挣扎。

3 个答案:

答案 0 :(得分:1)

最简单的解决方案是:

eventList.values().remove(eventObj);

然而,这使用了引擎盖下的迭代。没有迭代就无法解决这个问题。

答案 1 :(得分:0)

由于你无法迭代,你应该调用一个能在内部为你做的事情。 Map.replaceAll()应该有效。此方法将遍历每个条目,并将其值替换为BiFunction参数返回的值。函数的第一个参数是键,第二个是值。它应该返回新值。

示例:

map.replaceAll((key, value) -> {
    if ("foo".equals(value)) return null;
    return value;
}

答案 2 :(得分:0)

解决方案是编写两阶段代码:

  1. 收集属于该值的键
  2. 删除这些密钥 - 假设它们仍具有相同的值
  3. 在多线程访问的情况下,人们可能会考虑某种锁定。为简单起见,我们将此负担交给方法的调用者:

    public String removeEvent(Event eventObj) {
        // phase 1: collect the related keys
        List<Integer> keys = eventList.entrySet().stream()
                .filter(entry -> eventObj.equals(entry.getValue()))
                .map(entry -> entry.getKey())
                .collect(Collectors.toList());
    
        // phase 2: remove those keys
        for (Integer key : keys) {
            // this version of reomve double-checks if that key still has that value
            eventList.remove(key, eventObj);
        }
    
        // it would be good to know the criteria of failure - when should we return something else?
        return "Success";
    }