Google Guava提供的特殊的Table集合
1、Table 是个啥?
是一个特殊的映射,其中两个键可以在组合的方式被指定为单个值。它类似于创建映射的映射。
当你想使用多个键做索引的时候,你可能会用类似 Map<rowKey, Map<columnKye, value>> 的实现;例如Nacos的本地注册表不就是多层Map嵌套嘛
Guava为此提供了新集合类型 Table,它有两个支持所有类型的键:”行”和”列”,类似效果:Map --> Table --> rowKey+columnKye+value
2、Table 怎么引入?
导入guava依赖坐标就好了
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
官方文档
3、Table怎么玩?
public class TableTest {
public static void main(String[] args) {
Table<String, String, Integer> tables = HashBasedTable.create();
// 测试数据 学生 --- 课程 --- 分数
tables.put("张三", "javase", 80);
tables.put("李四", "javase", 90);
tables.put("张三", "oracle", 100);
tables.put("王五", "oracle", 95);
tables.put("王五", "Go", 60);
tables.put("秋秋", "Go", 100);
// 所有的行数据
Set<Table.Cell<String, String, Integer>> cells = tables.cellSet();
for (Table.Cell<String, String, Integer> temp : cells) {
System.out.println(temp.getRowKey() + ":" + temp.getColumnKey() + ":" + temp.getValue());
}
// List<Table.Cell<String, String, Integer>> list = cells.stream().sorted((o1, o2) -> o1.getValue() - o2.getValue()).collect(Collectors.toList());
// System.out.println("list = " + list);
/**
* 张三:javase:80
* 张三:oracle:100
* 李四:javase:90
* 王五:oracle:95
* 王五:Go:60
* 秋秋:Go:100
*/
System.out.println("==========学生查看成绩==============");
System.out.print("学生\t");
// 所有的课程
Set<String> cours = tables.columnKeySet();
for (String t : cours) {
System.out.print(t + "\t");
}
System.out.println();
/**
* 学生 javase oracle Go
*/
// 所有的学生
Set<String> stus = tables.rowKeySet();
for (String stu : stus) {
System.out.print(stu + "\t");
Map<String, Integer> scores = tables.row(stu);
for (String c : cours) {
System.out.print(scores.get(c) + "\t");
}
System.out.println();
}
/**
* 学生 javase oracle Go
* 张三 80 100 null
* 李四 90 null null
* 王五 null 95 60
* 秋秋 null null 100
*/
System.out.println("==========课程查看成绩==============");
System.out.print("课程\t");
// 所有的学生
Set<String> stuSet = tables.rowKeySet();
for (String t : stuSet) {
System.out.print(t + "\t");
}
/**
* 张三 李四 王五 秋秋
*/
System.out.println();
// 所有的课程
Set<String> courSet = tables.columnKeySet();
for (String c : courSet) {
System.out.print(c + "\t");
Map<String, Integer> scores = tables.column(c);
for (String s : stuSet) {
System.out.print(scores.get(s) + "\t");
}
System.out.println();
}
/**
* 课程 张三 李四 王五 秋秋
* javase 80 90 null null
* oracle 100 null 95 null
* Go null null 60 100
*/
System.out.println("===========转换===========");
// 相当于把rowKey和columnKey做了一个交换
Table<String, String, Integer> tables2 = Tables.transpose(tables);
// 所有的行数据
Set<Table.Cell<String, String, Integer>> cells2 = tables2.cellSet();
for (Table.Cell<String, String, Integer> temp : cells2) {
System.out.println(temp.getRowKey() + ":" + temp.getColumnKey() + ":" + temp.getValue());
}
/**
* javase:张三:80
* oracle:张三:100
* javase:李四:90
* oracle:王五:95
* Go:王五:60
* Go:秋秋:100
*/
main2();
}
public static void main2() {
Table<String, String, String> table = HashBasedTable.create();
// 使用员工详细信息初始化表
table.put("IBM", "101", "Mahesh");
table.put("IBM", "102", "Ramesh");
table.put("IBM", "103", "Suresh");
table.put("Microsoft", "111", "Sohan");
table.put("Microsoft", "112", "Mohan");
table.put("Microsoft", "113", "Rohan");
table.put("TCS", "121", "Ram");
table.put("TCS", "122", "Shyam");
table.put("TCS", "123", "Sunil");
// 获取与IBM对应的Map
Map<String, String> ibmMap = table.row("IBM");
System.out.println("===========IBM员工名单===========");
for (Map.Entry<String, String> entry : ibmMap.entrySet()) {
System.out.println("Emp Id: " + entry.getKey() + ", Name: " + entry.getValue());
}
System.out.println();
// 获取表格的所有唯一键
System.out.println("===========获取表格的所有唯一键===========");
Set<String> employers = table.rowKeySet();
System.out.print("Employers: ");
employers.forEach(e -> System.out.print(e + " "));
System.out.println("\n");
// 得到一个对应102的Map
System.out.println("===========得到一个对应102的Map===========");
Map<String, String> EmployerMap = table.column("102");
for (Map.Entry<String, String> entry : EmployerMap.entrySet()) {
System.out.println("Employer: " + entry.getKey() + ", Name: " + entry.getValue());
}
main3();
}
public static void main3() {
System.out.println("===========main3()===========");
Table<String, Integer, Integer> table = HashBasedTable.create();
table.put("A", 1, 100);
table.put("A", 2, 101);
table.put("B", 1, 200);
table.put("B", 2, 201);
/**
* contains(Object rowKey, Object columnKey):
* Table中是否存在指定rowKey和columnKey的映射关系
*/
boolean containsA3 = table.contains("A", 3); // false
System.out.println("containsA3 = " + containsA3);
boolean containColumn2 = table.containsColumn(2); // true
System.out.println("containColumn2 = " + containColumn2);
boolean containsRowA = table.containsRow("A"); // true
System.out.println("containsRowA = " + containsRowA);
boolean contains201 = table.containsValue(201); // true
System.out.println("contains201 = " + contains201);
/**
* remove(Object rowKey, Object columnKey):
* 删除Table中指定行列值的映射关系
*/
Integer res = table.remove("A", 2);
System.out.println("res = " + res);
/**
* get(Object rowKey, Object columnKey):
* 获取Table中指定行列值的映射关系
*/
Integer mapping = table.get("B", 2);
System.out.println("mapping = " + mapping);
/**
* column(C columnKey):返回指定columnKey下的所有rowKey与value映射
*/
Map<String, Integer> columnMap = table.column(2);
System.out.println("columnMap = " + columnMap);
/**
* row(R rowKey):返回指定rowKey下的所有columnKey与value映射
*/
Map<Integer, Integer> rowMap = table.row("B");
System.out.println("rowMap = " + rowMap);
/**
* 返回以Table.Cell<R, C, V>为元素的Set集合
* 类似于Map.entrySet
*/
Set<Table.Cell<String, Integer, Integer>> cells = table.cellSet();
for (Table.Cell<String, Integer, Integer> cell : cells) {
// 获取cell的行值rowKey
String rowKey = cell.getRowKey();
System.out.println("rowKey = " + rowKey);
// 获取cell的列值columnKey
Integer columnKey = cell.getColumnKey();
System.out.println("columnKey = " + columnKey);
// 获取cell的值value
Integer value = cell.getValue();
System.out.println("value = " + value);
}
}
}
Google Guava提供的特殊的Table集合的更多相关文章
- 使用Guava提供的filter过滤集合
正常情况下,我们声明一个List需要如下代码 List<String> list = new ArrayList<>(); list.add("AAA"); ...
- 字符串操作 — Google Guava
前言 Java 里字符串表示字符的不可变序列,创建后就不能更改.在我们日常的工作中,字符串的使用非常频繁,熟练的对其操作可以极大的提升我们的工作效率,今天要介绍的主角是 Google 开源的一个核心 ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
- [Google Guava] 2.1-不可变集合
范例 01 public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( 02 "red&quo ...
- [Google Guava] 强大的集合工具类:java.util.Collections中未包含的集合工具
转载的,有问题请联系我 原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collecti ...
- [Google Guava]学习--新集合类型Multiset
Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关.Multiset继承于JDK的Cllection接口,而不是Set接口. Multiset主要方法介绍: a ...
- [Google Guava] 2.2-新集合类型
转自:并发编程网 原文链接:http://ifeve.com/google-guava-newcollectiontypes/ 链接博客其他文章中还有更多的guava其他功能的描述,有空可慢慢看. G ...
- [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- [Google Guava] 4-函数式编程
原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...
- Guava学习笔记:Google Guava 类库简介
http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...
随机推荐
- 1.12 进程注入ShellCode套接字
在笔者前几篇文章中我们一直在探讨如何利用Metasploit这个渗透工具生成ShellCode以及如何将ShellCode注入到特定进程内,本章我们将自己实现一个正向ShellCodeShell,当进 ...
- 论文精读:带有源标签自适应的半监督域适应(Semi-Supervised Domain Adaptation with Source Label Adaptation)
Semi-Supervised Domain Adaptation with Source Label Adaptation 具有源标签适应的半监督域适应 原文链接 Abstract 文章指出当前的半 ...
- Jenkins 忘记密码|密码重置
I. 当前环境 OS Version : AlmaLinux release 8.8 Jenkins Version : 2.414.1 II. 操作步骤 2.1 修改配置文件 1. SSH 登录服务 ...
- Springboot中使用线程池的三种方式
前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场. 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟. 这里就介绍一下springboot中的多线 ...
- Eclipse OSGI配置文件说明
- 入门篇-其之四-字符串String的简单使用
什么是字符串? 在Java编程语言中,字符串用于表示文本数据. 字符串(String)属于引用数据类型,根据String的源码,其头部使用class进行修饰,属于类,即引用数据类型. 字符串的表示 字 ...
- Spring Boot中发送邮件时,如何让发件人显示别名
之前,我们通过一系列文章,介绍了如何在Spring Boot中发送邮件: 发送邮件 添加附件 引用静态资源 邮件模版 已经包含了大部分的应用场景.但最近DD在做YouTube中文配音的时候,碰到一个问 ...
- 舞会(lgP1352)
写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk 好吧其实是因为我记得上次做这题的时候写的是 bfs 设 \(f[i][0]\) 表示以 \(i\) ...
- Unity3D 选择焦点切换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 聊聊RNN与Attention
RNN系列: 聊聊RNN&LSTM 聊聊RNN与seq2seq attention mechanism,称为注意力机制.基于Attention机制,seq2seq可以像我们人类一样,将&quo ...