一、BiMap简介 BiMap,全称Bidirectional Map,即双向映射,是一种特殊的数据结构,它可以同时支持根据键查找值和根据值查找键的操作,这意味着在BiMap中,不仅键是唯一的,值也必须是唯一的 BiMap接口扩展了Map接口,并添加了一些方法来提供反向视图。 二、常用的BiMap实现类 Guava提供了HashBiMap和EnumBiMap两种常用的BiMap实现。 三、BiMap的常用方法 除了继承自Map接口的方法外,BiMap还添加了一些特有的方法: inverse(): 返回一个视图,其中的键和值与原BiMap中的值和键相反。 四、BIMap的用法 以下示例,展示了如何使用 Guava 的 HashBiMap 实现 BiMap 接口,并演示了它的多种方法: import com.google.common.collect.BiMap <String, Integer> biMap = HashBiMap.create(); // 向BiMap中添加元素 biMap.put("One",
json, new TypeReference>() {}); HashBiMap stringStringHashBiMap = HashBiMap.create(stringStringMap); BiMap "111", "111", "111", "111", "111", "111", "111"); System.out.println("format = " + format); BiMap biMap = HashBiMap.create(); biMap.put("1","Tom"); biMap.put("2","Jerry"); // 放入重复值value 将会报错 // biMap.put ("2","Tom"); // 相同Value覆盖前一个 //biMap.forcePut("2","Tom"); System.out.println(biMap); // key value反转 System.out.println(biMap.inverse());
(MotorBase::Cyclic_Synchronous_Torque, storage); } class InterfaceMapping { typedef boost::bimap boost::bimaps::multiset_of<std::string>, boost::bimaps::set_of<canopen::MotorBase::OperationMode> > bimap_type ; bimap_type mapping_; public: InterfaceMapping(){ mapping_.insert(bimap_type::value_type PositionJointInterface" ,canopen::MotorBase::Cyclic_Synchronous_Position)); mapping_.insert(bimap_type bool hasConflict(const std::string &interface, canopen::MotorBase::OperationMode mode){ bimap_type
*/ BiMap<Object, Object> biMap = HashBiMap.create(); biMap.put("张三",54); biMap.put ("李四",23); biMap.put("程思",33); biMap.put("吴楠",16); //key相同value不同,后面的会覆盖前面的 biMap.put("吴楠",46); //启动程序会报错 java.lang.IllegalArgumentException: value already present : 23 //biMap.put("张刚",23); //强行添加,会覆盖 //biMap.forcePut("张刚",23); System.out.println (biMap); //反转 key和value反转 BiMap<Object, Object> inverseMap = biMap.inverse();
(biMap.get("Tony"));BiMap<String, String> inverse = biMap.inverse();//使用value获取keySystem.out.println( 1、反转后操作的影响上面我们用inverse方法反转了原来BiMap的键值映射,但是这个反转后的BiMap并不是一个新的对象,它实现了一种视图的关联,所以对反转后的BiMap执行的所有操作会作用于原先的 BiMap上。 HashBiMap<String, String> biMap = HashBiMap.create();biMap.put("Hydra","Programmer");biMap.put("Tony" ,"IronMan");biMap.put("Thanos","Titan");BiMap<String, String> inverse = biMap.inverse();inverse.put("
可不可以双向:BiMap JDK提供的MAP让我们可以find value by key,那么能不能通过find key by value呢,能不能KEY和VALUE都是唯一的呢。 BiMap biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢? 你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。 因此,biMap.inverse() ! = biMap ;biMap.inverse().inverse() == biMap 可不可以多个KEY:Table 我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的
可不可以双向:BiMap JDK提供的MAP让我们可以find value by key,那么能不能通过find key by value呢,能不能KEY和VALUE都是唯一的呢。 biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢? 你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。 因此,biMap.inverse() ! = biMap ; biMap.inverse().inverse() == biMap 可不可以多个KEY:Table 我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的
可不可以双向:BiMap JDK提供的MAP让我们可以find value by key,那么能不能通过find key by value呢,能不能KEY和VALUE都是唯一的呢。 BiMap biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢? 你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。 因此,biMap.inverse() ! = biMap ; biMap.inverse().inverse() == biMap 可不可以多个KEY:Table 我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的
可不可以双向:BiMap JDK提供的MAP让我们可以find value by key,那么能不能通过find key by value呢,能不能KEY和VALUE都是唯一的呢。 BiMap biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢? 你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。 因此,biMap.inverse() ! = biMap ;biMap.inverse().inverse() == biMap 可不可以多个KEY:Table 我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的
BiMap 双向map在实际开发过程中,我们会经常通过value找对应的key值,如果是原有的map,我们只能循环整个map,对value进行匹配 从而寻找key for (String key : HashBiMap< Object, Object> biMap = HashBiMap.create(); biMap.put("Tom",1); biMap.put ("Jerry",2); biMap.put("Lily",3); BiMap<Object, Object> inverse = biMap.inverse (); inverse.get(1);但要注意的是在BiMap中Key和Value均不能重复且不能为null,并且inverse后的map与原map是一个对象,对inverse ",2); multimap.put("b",1); //[1, 2] System.out.println(multimap.get("a"));要注意,和BiMap
参考:https://www.baeldung.com/commons-collections-bidi-map 三、使用 Google Guava 我们还可以使用Google Guava包下的一个叫BiMap , "South Africa"); String capitalOfGermany = capitalCountryMap.inverse().get("Germany"); 和BidiMap一样,BiMap 不用说,BiMap也使用了大量内存来存储反向map。 如果你对BiMap感兴趣,可以戳这里:https://www.baeldung.com/guava-bimap 结论 本文简要讨论了通过键获取Map的值的方式。每种方法都有各自优缺点。
Multimap的实现类有: ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/… 可不可以双向:BiMap biMap/biMap.inverse()/biMap.inverse().inverse()它们是什么关系呢? 你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。 因此,biMap.inverse() ! = biMap ;biMap.inverse().inverse() == biMap 可不可以多个KEY:Table 我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的
Map Map<String, Collection<Integer>> collectionMap = map.asMap(); 多省事,多简洁,省得你再创建 Map<String, List> BiMap 一种连 value 也不能重复的 HashMap BiMap<String, String> biMap = HashBiMap.create(); // 如果value重复,put方法会抛异常, 除非用forcePut方法 biMap.put("key","value"); System.out.println(biMap); // 输出 {"key":"value"} // 既然value 不能重复,何不实现个翻转key/value的方法,已经有了 BiMap<String, String> inverse = biMap.inverse(); System.out.println(
是谷歌基于java封装好的开源库,它的性能、实用性,比我们自己造的轮子更好,毕竟谷歌出品,下面介绍下几个常用的guava工具类 LoadingCache(本地缓存) Multimap 和 Multiset BiMap System.out.println(set.size()); System.out.println(set.count("csc")); --------------------------- 3 2 5BiMap BiMap的键必须唯一,值也必须唯一,可以实现value和key互转 示例 BiMap<Integer,String> biMap = HashBiMap.create(); biMap.put(1, "lwl"); biMap.put(2,"csc"); BiMap<String, Integer> map = biMap.inverse(); // value和key互转 map.forEach(
//二元接续的 @ 前的内容 int idB = CoreDictionary.trie.exactMatchSearch(b);//@ 后的内容 TreeMap<Integer, Integer> biMap = map.get(idA); if (biMap == null){ biMap = new TreeMap<Integer, Integer>(); map.put(idA, biMap );// } biMap.put(idB, freq); 比如二元接续:“一 一@中”,@ 前的内容是:“一 一”,@后的内容是 “中”。 由于同一个前缀可以有多个后续,比如: 一一@中 1 一一@为 6 一一@交谈 1 所有以 '一 一' 开头的 @ 后的后缀 以及对应的频率 都保存到 相应的biMap中:biMap.put(idB, freq 注意:biMap和map是不同的,map保存整个二元核心词典,而biMap保存某个词对应的所有后缀(这个词 @ 后的所有条目) map中保存二元核心词典示意图如下: 图1.png 二元核心词典主要由CoreBiGramTableDictionary.java
System.out.println(collectionMap); // 输出 {"key":[1,2]} } 多省事,多简洁,省得你再创建 Map<String, List> 3.2.2 BiMap 一种连value也不能重复的HashMap @Test public void testHashBiMap() { BiMap<String, String> biMap = HashBiMap.create(); // 如果value重复,put方法会抛异常,除非用forcePut方法 biMap.put("key","value"); System.out.println(biMap); // 输出 {"key":"value"} // 既然value不能重复,何不实现个翻转key/value的方法, 已经有了 BiMap<String, String> inverse = biMap.inverse(); System.out.println(inverse); //
BiMap BiMap 可以用来实现键值对的双向映射需求,这样我们就可以通过 Key 查找对对应的 Value,也可以使用 Value 查找对应的 Key。 使用 BiMap 修改上面的代码: ? 这里需要注意,BiMap#put方法不能加入重复元素, 若加入,将会抛错。如果若特定值一定要替换,可以使用 BiMap#forcePut代替。 同样的 BiMap 也有各种实现类: ? 其他扩展集合类 Guava 另外还提供其他集合类,不过这些类使用起来有点复杂,小黑哥还未在业务代码中使用过,这里简单提下,感兴趣同学可以深入了解一下。
刚好BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。 这时我们就可以考虑使用Guava中的BiMap了。 2.使用Guava中的BiMap package com.guava; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap 数据的强制唯一性 在使用BiMap进行key、value反转时,会要求Value的唯一性。 package com.guava; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap
Validator.isEmail("沉默王二"); Validator.isMobile("itwanger.com"); 12、双向查找 Map Guava 中提供了一种特殊的 Map 结构,叫做 BiMap BiMap<String, String> biMap = new BiMap<>(new HashMap<>()); biMap.put("wanger", "沉默王二"); biMap.put("wangsan ", "沉默王三"); // get value by key biMap.get("wanger"); biMap.get("wangsan"); // get key by value biMap.getKey ("沉默王二"); biMap.getKey("沉默王三"); 在实际的开发工作中,其实我更倾向于使用 Guava 的 BiMap,而不是 Hutool 的。
<String, Collection<Integer>> collectionMap = map.asMap(); 多省事,多简洁,省得你再创建 Map<String, List> 3.2.2 BiMap 一种连value也不能重复的HashMap BiMap<String, String> biMap = HashBiMap.create(); // 如果value重复,put方法会抛异常,除非用 forcePut方法 biMap.put("key","value"); System.out.println(biMap); // 输出 {"key":"value"} // 既然value 不能重复,何不实现个翻转key/value的方法,已经有了 BiMap<String, String> inverse = biMap.inverse(); System.out.println