正文
//rowKey或columnKey的集合
Set rowKeys = table.rowKeySet();
Set columnKeys = table.columnKeySet();
//value集合
Collection values = table.values();
分别打印它们的结果,
key
的集合是不包含重复元素的,
value
集合则包含了所有元素并没有去重:
[Hydra, Trunks]
[Jan, Feb]
[20, 28, 28, 16]
以统计所有
rowKey
对应的
value
之和为例:
for (String key : table.rowKeySet()) {
Set> rows = table.row(key).entrySet();
int total = 0;
for (Map.Entry row : rows) {
total += row.getValue();
}
System.out.println(key + ": " + total);
}
打印结果:
Hydra: 48
Trunks: 44
这一操作也可以理解为行和列的转置,直接调用
Tables
的静态方法
transpose
:
Table table2 = Tables.transpose(table);
Set> cells = table2.cellSet();
cells.forEach(cell->
System.out.println(cell.getRowKey()+","+cell.getColumnKey()+":"+cell.getValue())
);
利用
cellSet
方法可以得到所有的数据行,打印结果,可以看到
row
和
column
发生了互换:
Jan,Hydra:20
Feb,Hydra:28
Jan,Trunks:28
Feb,Trunks:16
还记得我们在没有使用
Table
前存储数据的格式吗,如果想要将数据还原成嵌套
Map
的那种形式,使用
Table
的
rowMap
或
columnMap
方法就可以实现了:
Map> rowMap = table.rowMap();
Map> columnMap = table.columnMap();
查看转换格式后的
Map
中的内容,分别按照行和列进行了汇总:
{Hydra={Jan=20, Feb=28}, Trunks={Jan=28, Feb=16}}
{Jan={Hydra=20, Trunks=28}, Feb={Hydra=28, Trunks=16}}
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
在普通
Map
中,如果要想根据
value
查找对应的
key
,没什么简便的办法,无论是使用
for
循环还是迭代器,都需要遍历整个
Map
。以循环
keySet
的方式为例:
public List findKey(Map map, String val){
List keys=new ArrayList<>();
for (String key : map.keySet()) {
if (map.get(key).equals(val))
keys.add(key);
}
return keys;
}
而guava中的
BiMap
提供了一种
key
和
value
双向关联的数据结构,先看一个简单的例子:
HashBiMap biMap = HashBiMap.create();
biMap.put("Hydra","Programmer");
biMap.put("Tony","IronMan");
biMap.put("Thanos","Titan");
//使用key获取value
System.out.println(biMap.get("Tony"));
BiMap inverse = biMap.inverse();
//使用value获取key
System.out.println(inverse.get("Titan"));
执行结果,:
IronMan
Thanos
看上去很实用是不是?但是使用中还有几个坑得避一下,下面一个个梳理。
上面我们用
inverse
方法反转了原来
BiMap
的键值映射,但是这个反转后的
BiMap
并不是一个新的对象,它实现了一种视图的关联,所以对反转后的
BiMap
执行的所有操作会作用于原先的
BiMap
上。
HashBiMap biMap = HashBiMap.create();
biMap.put(