我的作业要求我配置一个配置的地图......
Map<Integer,Event> eventList = new HashMap<>();
我必须编写一个具有以下标题的方法......
public String removeEvent(Event eventObj)
我们的想法是将它传递给Event对象,检查事件是否已经作为Map中的值存在,如果存在,则将其删除并返回String消息,确认它已被删除。
我遇到的问题是它规定我不能在地图上迭代解决方案。
我可以使用containsValue()方法或覆盖的equals()方法来检查对象是否已经存在于地图中,但我现在遇到的问题是我不知道如何删除密钥对值匹配?
任何帮助都会很好,因为我对地图很陌生并经常在Key和Value之间挣扎。
答案 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)
解决方案是编写两阶段代码:
在多线程访问的情况下,人们可能会考虑某种锁定。为简单起见,我们将此负担交给方法的调用者:
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";
}