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集合的更多相关文章

  1. 使用Guava提供的filter过滤集合

    正常情况下,我们声明一个List需要如下代码 List<String> list = new ArrayList<>(); list.add("AAA"); ...

  2. 字符串操作 — Google Guava

    前言 Java 里字符串表示字符的不可变序列,创建后就不能更改.在我们日常的工作中,字符串的使用非常频繁,熟练的对其操作可以极大的提升我们的工作效率,今天要介绍的主角是 Google 开源的一个核心 ...

  3. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  4. [Google Guava] 2.1-不可变集合

    范例 01 public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( 02 "red&quo ...

  5. [Google Guava] 强大的集合工具类:java.util.Collections中未包含的集合工具

    转载的,有问题请联系我 原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collecti ...

  6. [Google Guava]学习--新集合类型Multiset

    Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关.Multiset继承于JDK的Cllection接口,而不是Set接口. Multiset主要方法介绍: a ...

  7. [Google Guava] 2.2-新集合类型

    转自:并发编程网 原文链接:http://ifeve.com/google-guava-newcollectiontypes/ 链接博客其他文章中还有更多的guava其他功能的描述,有空可慢慢看. G ...

  8. [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  9. [Google Guava] 4-函数式编程

    原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...

  10. Guava学习笔记:Google Guava 类库简介

    http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...

随机推荐

  1. Android13深入了解 Android 小窗口模式和窗口类型

    Android13深入了解 Android 小窗口模式和窗口类型 小窗模式,作为一种在移动设备上的多任务处理方式,为用户带来了便捷和高效的体验,尤其在一些特定场景下,其价值愈发凸显.以下是为什么需要小 ...

  2. 谈谈JSF业务线程池的大小配置

    1.简介 JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200).此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小. 本文旨 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (95)-- 算法导论9.2 4题

    四.用go语言,假设用RANDOMIZED-SELECT 去选择数组 A=(3,2,9,0,7,5,4,8,6,1)的最小元素,给出能够导致 RANDOMIZED-SELECT最坏情况发生的一个划分序 ...

  4. Games101现代计算机图形学入门 - 作业1~8 集合含提高项总结

    Github 地址 :Games101 作业总结 Games101 官网:Games101 - 现代图形学入门 记录 Games101 Homework 系列 1 ~ 8 及相关作业提高项 环境安装 ...

  5. JUC并发编程(1)—CompletableFuture详解

    @ 目录 CompletableFuture介绍 1.创建异步任务 2.CompletableFuture API ①. 获得结果和触发计算(get.getNow.join.complete) ②. ...

  6. 汇编debug的安装

    实验一查看CPU和内存,用机器指令和汇编指令编程 在做实验前需要debug命令. 工具:dosbox,debug.exe 安装:dosbox :https://www.dosbox.com/ debu ...

  7. 要知其然还要知其所以然printChar

    虽然过渡与的追求细节不是好事, 但是现实社会逼迫我们不得不兼顾周全. 所以什么都是最好不仅要知其然还要知其所以然! public class printChar { public static voi ...

  8. DICOM PS3.7 2021a - Message Exchange

    PS3.7 DICOM PS3.7 2021a - Message Exchange DICOM Standards Committee Copyright 2021 NEMA A DICOM pub ...

  9. 基于落点打分的井字棋智能下棋算法(C语言实现)

    本文设计了一种基于落地打分的井字棋下棋算法,能够实现电脑不败,所以如果玩家会玩的话,一般是平局. 算法核心 电脑根据对落子位置的打分,选择分数最高的位置,若不同落点分数相同则随机选择位置(随机选择就不 ...

  10. 如何优雅重启 kubernetes 的 Pod

    最近在升级服务网格 Istio,升级后有个必要的流程就是需要重启数据面的所有的 Pod,也就是业务的 Pod,这样才能将这些 Pod 的 sidecar 更新为新版本. 方案 1 因为我们不同环境的 ...