Map<String Map<String Integer>> rowMap = table.rowMap();Map<String Map<String Integer>> columnMap = table.columnMap();
查看转换格式后的Map中的内容 , 分别按照行和列进行了汇总:
{Hydra={Jan=20 Feb=28 Trunks={Jan=28 Feb=16
{Jan={Hydra=20 Trunks=28 Feb={Hydra=28 Trunks=16
BiMap - 双向Map在普通Map中 , 如果要想根据value查找对应的key , 没什么简便的办法 , 无论是使用for循环还是迭代器 , 都需要遍历整个Map 。 以循环keySet的方式为例:
public List<String> findKey(Map<String String> map String val){
List<String> keys=new ArrayList<>(); for (String key : map.keySet()) { if (map.get(key).equals(val))
keys.add(key);
return keys;
而guava中的BiMap提供了一种key和value双向关联的数据结构 , 先看一个简单的例子:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Hydra\"\"Programmer\");
biMap.put(\"Tony\"\"IronMan\");
biMap.put(\"Thanos\"\"Titan\");//使用key获取valueSystem.out.println(biMap.get(\"Tony\"));
BiMap<String String> inverse = biMap.inverse();//使用value获取keySystem.out.println(inverse.get(\"Titan\"));
执行结果 , :
IronManThanos
看上去很实用是不是?但是使用中还有几个坑得避一下 , 下面一个个梳理 。
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(\"IronMan\"\"Stark\");
System.out.println(biMap);
对反转后的BiMap中的内容进行了修改后 , 再看一下原先BiMap中的内容:
{Hydra=Programmer Thanos=Titan Stark=IronMan
可以看到 , 原先值为IronMan时对应的键是Tony , 虽然没有直接修改 , 但是现在键变成了Stark 。
2、value不可重复BiMap的底层继承了Map , 我们知道在Map中key是不允许重复的 , 而双向的BiMap中key和value可以认为处于等价地位 , 因此在这个基础上加了限制 , value也是不允许重复的 。 看一下下面的代码:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Tony\"\"IronMan\");
biMap.put(\"Stark\"\"IronMan\");
这样代码无法正常结束 , 会抛出一个IllegalArgumentException异常:
如果你非想把新的key映射到已有的value上 , 那么也可以使用forcePut方法强制替换掉原有的key:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Tony\"\"IronMan\");
biMap.forcePut(\"Stark\"\"IronMan\");
打印一下替换后的BiMap:
{Stark=IronMan
顺带多说一句 , 由于BiMap的value是不允许重复的 , 因此它的values方法返回的是没有重复的Set , 而不是普通Collection:
Set<String> values = biMap.values();
Multimap - 多值Mapjava中的Map维护的是键值一对一的关系 , 如果要将一个键映射到多个值上 , 那么就只能把值的内容设为集合形式 , 简单实现如下:
Map<String List<Integer>> map=new HashMap<>();
List<Integer> list=new ArrayList<>();list.add(1);list.add(2);map.put(\"day\"list);
guava中的Multimap提供了将一个键映射到多个值的形式 , 使用起来无需定义复杂的内层集合 , 可以像使用普通的Map一样使用它 , 定义及放入数据如下:
- 信用卡|发达国家信用卡支付太普及,根本不能像中国这样普遍流行手机移动支付
- 京东|中国第一民企换人,3个月亏52亿仍反超华为,员工总数已超30万人
- 中国移动|东数西算,打好了就是中国移动的翻身仗!
- 本文转自:交通发布来源丨中国公路建设行业协会编辑丨李源源审核丨连萌监制丨孙英利投稿邮箱:...|第一届全国公路高质量发展大会,四月召开!
- 中国电信快速响应,助力漳州台商投资区再战疫情
- 短视频|中国最新慈善榜出炉,马云跌出前五,曹德旺第二,第一名捐107亿
- 海信|执掌海信30年!中国家电巨头创始人周厚健正式退休
- 运动会|中国队61枚奖牌完美收官:金牌奖牌都断层第一
- 电动车|51岁中航奇女子 将收获一个动力电池IPO
- 北京|中国提前锁定残奥会金牌榜、奖牌榜第一 创造了历史