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 ...
随机推荐
- Java NIO 图解 Netty 服务端启动的过程
一.启动概述 了解整体Netty常用的核心组件后,并且对比了传统IO模式.在对比过程中,找到了传统IO对应Netty中是如何实现的.最后我们了解到在netty中常用的那些组件. 本文在了解下这些核心组 ...
- selenium-wire兼容selenium和requests
背景 在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效. 而实战课就有这样一个案例,不过那个案例是UI操作和API分开的. 极少会遇到这 ...
- 让你的HpSocket Pull支持同步(应答式)操作
什么是HPSocket HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/ ...
- 使用antd-mobile遇到的坑
在使用antd-mobile中的组件的时候,遇到了一些比较棘手的问题,经过查找相关资料和网上的帮助,在此整理出了问题以及解决办法: 在引入antd-mobile的时候,根据官网提供的文档: 1,首先安 ...
- Spring Boot中自动装配机制的原理
SpringBoot中自动装配机制的原理 1.自动装配,简单来说就是自动把第三方组件的Bean装载到Spring IOC容器里面,不需要开发人员再去写Bean的装配配置, 2.在Spring Boot ...
- python基础:集合(set)字典(direction)介绍
三.字典(dict) 1.字典的创建赋值创建字典In [2]: d = {1,True,"hello"} In [3]: type(d)Out[3]: set #字典由key和va ...
- 「coci 2021-2022 #1」Logičari
link. 断环后把断的边所连的两个点特殊标记,作为两个特殊点.这样就是一个树,树的做法很简单吧,把两个特殊点特殊处理带进状态即可. 具体一点就是,设 \(f(x,c_x,c_f,c_{rt_1},c ...
- IntelliJ IDEA安装中文插件
1.运行IntelliJ IDEA程序2.点击左上角"File"//文件3.点击下拉的"Settings" //设置4.点击"Plugins" ...
- 10 Myths About Introverts
By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...
- SOA认知和方法论
1 前言 1.1 架构分类 在软件设计领域,企业架构通常被划分为如下五种分类: 如何理解架构分类依据及其彼此之间的关系?业务是企业赖以生存之本,因此业务架构是基础.是灵魂,其他一切均是对业务架构的支撑 ...