You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:55:13