gpt4 book ai didi

java - Java中的双向多值映射

转载 作者:IT老高 更新时间:2023-10-28 21:01:35 26 4
gpt4 key购买 nike

我正在寻找一种存储键值对的方法。我需要查找是双向的,但同时我需要为同一个键存储多个值。换句话说,类似于 BidiMap,但每个键都可以有多个值。例如,它需要能够保存如下对:“s1”->1、“s2”->1、“s3”->2,并且我需要能够获取映射到每个键的值,并且对于每个值,获取与其关联的所有键。

最佳答案

所以您需要支持多对多关系吗?您能得到的最接近的是 Guava Multimap 就像@Mechkov 写的一样——但更具体地说Multimap Multimaps.invertFrom 结合使用. “BiMultimap”还没有实现,但是有an issue在 Google Guava 库中请求此功能。

此时你有几个选择:

  1. 如果你的“BiMultimap”是不可变的常量 - 使用 Multimaps.invertFromImmutableMultimap/ImmutableListMultimap/ImmutableSetMultimap (这三个中的每一个都有不同的集合存储值)。一些代码(示例取 self 开发的应用程序,使用 EnumSets.immutableEnumSet):

    public class RolesAndServicesMapping {
    private static final ImmutableMultimap<Service, Authority> SERVICES_TO_ROLES_MAPPING =
    ImmutableMultimap.<Service, Authority>builder()
    .put(Service.SFP1, Authority.ROLE_PREMIUM)
    .put(Service.SFP, Authority.ROLE_PREMIUM)
    .put(Service.SFE, Authority.ROLE_EXTRA)
    .put(Service.SF, Authority.ROLE_STANDARD)
    .put(Service.SK, Authority.ROLE_STANDARD)
    .put(Service.SFP1, Authority.ROLE_ADMIN)
    .put(Service.ADMIN, Authority.ROLE_ADMIN)
    .put(Service.NONE, Authority.ROLE_DENY)
    .build();

    // Whole magic is here:
    private static final ImmutableMultimap<Authority, Service> ROLES_TO_SERVICES_MAPPING =
    SERVICES_TO_ROLES_MAPPING.inverse();
    // before guava-11.0 it was: ImmutableMultimap.copyOf(Multimaps.invertFrom(SERVICES_TO_ROLES_MAPPING, HashMultimap.<Authority, Service>create()));

    public static ImmutableSet<Authority> getRoles(final Service service) {
    return Sets.immutableEnumSet(SERVICES_TO_ROLES_MAPPING.get(service));
    }

    public static ImmutableSet<Service> getServices(final Authority role) {
    return Sets.immutableEnumSet(ROLES_TO_SERVICES_MAPPING.get(role));
    }
    }
  2. 如果你真的希望你的 Multimap 是可修改的,那么很难同时维护 K->V 和 V->K 变体,除非你只修改 kToVMultimap并调用invertFrom每次你想要它的倒置副本(并使该副本不可修改以确保你不小心不修改 vToKMultimap 什么不会更新 kToVMultimap )。这不是最佳的,但在这种情况下应该这样做。

  3. (可能不是你的情况,作为奖励提到): BiMap 接口(interface)和实现类有.inverse()给出 BiMap<V, K> 的方法从 BiMap<K, V> 查看和它自己在biMap.inverse().inverse() 之后.如果 this issue我之前提到的完成,它可能会有类似的东西。

  4. (2016 年 10 月编辑) 您也可以使用 new graph API将出现在 Guava 20 :

    As a whole, common.graph supports graphs of the following varieties:

    • directed graphs
    • undirected graphs
    • nodes and/or edges with associated values (weights, labels, etc.)
    • graphs that do/don't allow self-loops
    • graphs that do/don't allow parallel edges (graphs with parallel edges are sometimes called multigraphs)
    • graphs whose nodes/edges are insertion-ordered, sorted, or unordered

关于java - Java中的双向多值映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8066109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com