Java中构建单动作多动词映射及反向查询的数据结构选型
在Java中实现Action与多Verb的双向映射
嘿,我来给你分享一个在Java里实现这个需求的靠谱方案——既要支持一个Action对应多个数量不固定的Verb(硬编码映射),又能根据Verb反向查到对应的Action,其实用双向Map就能搞定,而且效率还很高。
核心思路
咱们需要维护两个映射:
- 一个正向映射:把每个Action对应到它的Verb集合,用
Map<String, Set<String>>来存,这样一个Action能关联任意多的Verb。 - 一个反向映射:把每个Verb对应到唯一的Action,用
Map<String, String>来存,这样反向查询直接O(1)就能拿到结果。
初始化的时候直接把硬编码的映射关系加载进去,同时维护好这两个Map的一致性就行。
完整实现代码
我写了一个封装好的类ActionVerbMapper,直接用就行,里面还加了测试用例:
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class ActionVerbMapper { // 正向:Action → 对应的Verb集合 private final Map<String, Set<String>> actionToVerbs; // 反向:Verb → 对应的Action private final Map<String, String> verbToAction; public ActionVerbMapper() { actionToVerbs = new HashMap<>(); verbToAction = new HashMap<>(); // 硬编码所有映射关系 loadMappings(); } private void loadMappings() { // 给Action1绑定3个Verb bindActionToVerbs("Action1", "verb1", "verb2", "verb3"); // 给Action2绑定2个Verb bindActionToVerbs("Action2", "verb4", "verb5"); // Action3只绑定1个Verb,完全没问题 bindActionToVerbs("Action3", "verb6"); // 要是有更多Action,继续加就行 } // 辅助方法:批量绑定Action和Verb,同时更新正反向映射 private void bindActionToVerbs(String action, String... verbs) { // 处理正向映射:如果Action还没存,就新建一个Set;否则把Verb加进去 actionToVerbs.computeIfAbsent(action, k -> new HashSet<>()).addAll(Set.of(verbs)); // 处理反向映射:每个Verb对应到当前Action for (String verb : verbs) { // 这里加了个校验:如果同一个Verb被绑定到多个Action,直接抛异常 // 你也可以改成日志提示或者覆盖旧映射,看你需求 if (verbToAction.containsKey(verb)) { throw new IllegalArgumentException("Verb '" + verb + "' 已经被绑定到Action '" + verbToAction.get(verb) + "' 啦!"); } verbToAction.put(verb, action); } } // 根据Action获取对应的所有Verb public Set<String> getVerbsForAction(String action) { // 返回不可变集合,防止外部乱改内部数据 return Set.copyOf(actionToVerbs.getOrDefault(action, Set.of())); } // 根据Verb反向查询对应的Action public String getActionForVerb(String verb) { return verbToAction.get(verb); } // 测试一下效果 public static void main(String[] args) { ActionVerbMapper mapper = new ActionVerbMapper(); // 正向查询:看看Action1有哪些Verb System.out.println("Action1对应的Verb:" + mapper.getVerbsForAction("Action1")); // 反向查询:输入verb4,应该返回Action2 System.out.println("verb4对应的Action:" + mapper.getActionForVerb("verb4")); // 查一个不存在的Verb,返回null System.out.println("verb99对应的Action:" + mapper.getActionForVerb("verb99")); } }
几个关键细节说明
- 数据一致性:用
bindActionToVerbs方法同时维护两个Map,确保添加映射时正反向数据不会脱节。 - 重复Verb处理:代码里默认不允许同一个Verb绑定多个Action,会抛异常,你可以根据业务需求调整这个逻辑(比如覆盖旧映射或者打个日志)。
- 不可变返回值:
getVerbsForAction返回的是不可变的Set,这样外部代码没法修改内部的映射集合,避免数据被意外篡改。 - 灵活的Verb数量:用了可变参数
String... verbs,每个Action可以绑定任意数量的Verb,完全符合你的要求。
运行结果
跑一下main方法,输出是这样的:
Action1对应的Verb:[verb1, verb2, verb3]
verb4对应的Action:Action2
verb99对应的Action:null
完美满足你要的所有功能~
内容的提问来源于stack exchange,提问作者Amy Thomas
相关产品推荐
相关产品推荐

