Java中的双向多值映射
我正在寻找一种存储键值对的方法。我需要双向查询,但同时我需要为同一个键存储多个值。换句话说,类似于BidiMap,但是对于每个键,可以有多个值。例如,它需要能够保存以下对:“ s1”-> 1,“ s2”-> 1,“ s3”-> 2,并且我需要能够将值映射到每个键,并且对于每个值,获取与其关联的所有键。
回答:
因此,你需要多对多关系的支持吗?你可以得到的最接近的是Guava,Multimap就像@Mechkov所写的-但更具体地讲是Multimap
与组合Multimaps.invertFrom
。“ BiMultimap”
尚未实现,但在Google Guava
库中请求此功能时存在问题。
此时,你有几种选择:
如果你的“ BiMultimap”将变为不可变常量,请使用Multimaps.invertFrom和ImmutableMultimap/ ImmutableListMultimap/ ImmutableSetMultimap
(这三个中的每个都有不同的集合存储值)。一些代码(示例取自我开发的应用程序,使用Enum
和Sets.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));
}
}
如果你确实希望Multimap是可修改的,那么除非同时进行修改kToVMultimap
并invertFrom
每次都想调用其反向副本(并且使该副本不可修改),否则很难同时维护K-> V
和V-> K
变体。以确保你不小心不修改vToKMultimap不会更新的内容kToVMultimap
)。这不是最佳选择,但在这种情况下应该这样做。
(可能不是你的情况,提到了额外的好处):BiMap接口和实现类具有在之后.inverse()提供BiMapBiMap<K, V>biMap.inverse().inverse()
总体而言,common.graph支持以下品种的图形:
- 有向图
- 无向图
- 具有相关值(权重,标签等)的节点和/或边
- 不允许/不允许自循环的图形
- 不允许/不允许平行边的图(具有平行边的图有时称为多图)
- 节点/边按插入顺序排列,排序或无序的图
以上是 Java中的双向多值映射 的全部内容, 来源链接: utcz.com/qa/413077.html