依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 75|回复: 0

精通Google Guava库二维映射表Table,提升编程效率的API利器

[复制链接] 主动推送

2076

主题

2083

帖子

3214

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3214
发表于 2024-10-6 15:19:59 | 显示全部楼层 |阅读模式
精通Google Guava库二维映射表Table,提升编程效率的API利器
Java开发中常使用Map来存储键值对,其键是唯一的,可快速查找对应的值。但某些场景下需要更复杂的映射结构,其中键由两部分组成,类似于一个二维表格的行和列。Guava库中的Table接口正是为了满足这种需求而设计的。

一、什么是Guava Table

Guava的Table是一种特殊的数据结构,它用两个键(行键和列键)来映射一个值。可将Table视为二维的Map,其中每个单元格都由行键和列键唯一确定,并存储一个值。

二、Guava Table的实现类

Guava提供了几种Table的实现类:

  • HashBasedTable:最常用的实现,它基于哈希表来存储数据。HashBasedTable提供了快速的插入、查找和删除操作,并且不保证键顺序。

  • TreeBasedTable:实现基于红黑树,根据键的自然顺序或者提供的比较器对行键和列键进行排序。TreeBasedTable在按键顺序遍历数据时非常高效,但插入和查找操作可能比哈希表慢。

  • ImmutableTable:不可变的Table实现,在创建时接收所有数据,之后不允许修改。ImmutableTable对于需要共享或发布不可变数据集的情况非常有用,同时它提供了高效的内存使用。


三、如何使用Guava Table

来个DEMO创建Table、添加数据、检索数据、修改数据、遍历数据,以及一些其他高级特性的使用。

  1. import com.google.common.collect.HashBasedTable;  
  2. import com.google.common.collect.Table;  
  3.   
  4. import java.util.Map;  
  5. import java.util.Set;  
  6.   
  7. public class GuavaTableAdvancedExample {  
  8.   
  9.     public static void main(String[] args) {  
  10.         // 创建一个Table实例  
  11.         Table<String, String, Integer> workHoursTable = HashBasedTable.create();  
  12.   
  13.         // 添加数据  
  14.         workHoursTable.put("Alice", "ProjectA", 40);  
  15.         workHoursTable.put("Bob", "ProjectA", 30);  
  16.         workHoursTable.put("Alice", "ProjectB", 20);  
  17.         workHoursTable.put("Charlie", "ProjectC", 50);  
  18.   
  19.         // 检索数据  
  20.         Integer aliceProjectAHours = workHoursTable.get("Alice", "ProjectA");  
  21.         System.out.println("Alice worked " + aliceProjectAHours + " hours on ProjectA.");  
  22.   
  23.         // 使用row()方法获取特定行的映射  
  24.         Map<String, Integer> aliceWorkHours = workHoursTable.row("Alice");  
  25.         System.out.println("Alice's work hours: " + aliceWorkHours);  
  26.   
  27.         // 使用column()方法获取特定列的映射  
  28.         Map<String, Integer> projectAWorkHours = workHoursTable.column("ProjectA");  
  29.         System.out.println("Work hours on ProjectA: " + projectAWorkHours);  
  30.   
  31.         // 遍历表格  
  32.         for (Table.Cell<String, String, Integer> cell : workHoursTable.cellSet()) {  
  33.             System.out.println(cell.getRowKey() + " worked " + cell.getValue() + " hours on " + cell.getColumnKey() + ".");  
  34.         }  
  35.   
  36.         // 修改数据  
  37.         workHoursTable.put("Alice", "ProjectA", aliceProjectAHours + 5);
  38.         // Alice在ProjectA上多工作了5小时  
  39.         System.out.println("After update, Alice worked " + workHoursTable.get("Alice", "ProjectA") + " hours on ProjectA.");  
  40.   
  41.         // 检查是否包含某个键值对  
  42.         boolean hasBobOnProjectB = workHoursTable.contains("Bob", "ProjectB");  
  43.         System.out.println("Does Bob work on ProjectB? " + hasBobOnProjectB);  
  44.   
  45.         // 检查行键或列键是否存在  
  46.         boolean hasRowKeyCharlie = workHoursTable.containsRow("Charlie");  
  47.         boolean hasColumnKeyProjectD = workHoursTable.containsColumn("ProjectD");  
  48.         System.out.println("Does the table have a row for Charlie? " + hasRowKeyCharlie);  
  49.         System.out.println("Does the table have a column for ProjectD? " + hasColumnKeyProjectD);  
  50.   
  51.         // 获取所有的行键、列键或值  
  52.         Set<String> allRowKeys = workHoursTable.rowKeySet();  
  53.         Set<String> allColumnKeys = workHoursTable.columnKeySet();  
  54.         Set<Integer> allValues = workHoursTable.values();  
  55.   
  56.         System.out.println("All row keys: " + allRowKeys);  
  57.         System.out.println("All column keys: " + allColumnKeys);  
  58.         System.out.println("All values: " + allValues);  
  59.   
  60.         // 移除数据  
  61.         workHoursTable.remove("Alice", "ProjectB");
  62.         // Alice不再在ProjectB上工作  
  63.         System.out.println("After removal, Alice's work hours on ProjectB: " + workHoursTable.get("Alice", "ProjectB"));  
  64.     }  
  65. }
复制代码

如果不使用table,那就需要用嵌套Map实现

与Guava Table相比,嵌套的Map在处理某些操作时会更繁琐,例如检查列键是否存在,需要遍历所有的内部Map。嵌套的Map也没有Guava Table提供的一些高级功能和优化。

  1. // 创建嵌套Map来模拟Table  
  2.         Map<String, Map<String, Integer>> workHoursMap = new HashMap<>();  
  3.   
  4.         // 添加数据  
  5.         addWorkHours(workHoursMap, "Alice", "ProjectA", 40);  
  6.         addWorkHours(workHoursMap, "Bob", "ProjectA", 30);  
  7.         addWorkHours(workHoursMap, "Alice", "ProjectB", 20);  
  8.         addWorkHours(workHoursMap, "Charlie", "ProjectC", 50);  
  9.   
  10.         // 检索数据  
  11.         Integer aliceProjectAHours = getWorkHours(workHoursMap, "Alice", "ProjectA");  
  12.         System.out.println("Alice worked " + aliceProjectAHours + " hours on ProjectA.");  
  13.   
  14.         // 遍历嵌套Map  
  15.         for (Map.Entry<String, Map<String, Integer>> entry : workHoursMap.entrySet()) {  
  16.             String employee = entry.getKey();  
  17.             Map<String, Integer> projects = entry.getValue();  
  18.             for (Map.Entry<String, Integer> projectEntry : projects.entrySet()) {  
  19.                 String project = projectEntry.getKey();  
  20.                 Integer hours = projectEntry.getValue();  
  21.                 System.out.println(employee + " worked " + hours + " hours on " + project + ".");  
  22.             }  
  23.         }  
  24.   
  25.         // 修改数据  
  26.         setWorkHours(workHoursMap, "Alice", "ProjectA", aliceProjectAHours + 5);
  27.         
  28.         // Alice在ProjectA上多工作了5小时  
  29.         System.out.println("After update, Alice worked " + getWorkHours(workHoursMap, "Alice", "ProjectA") + " hours on ProjectA.");  
  30.   
  31.         // 检查是否包含某个键值对  
  32.         boolean hasBobOnProjectB = containsWorkHours(workHoursMap, "Bob", "ProjectB");  
  33.         System.out.println("Does Bob work on ProjectB? " + hasBobOnProjectB);  
  34.   
  35.         // 检查行键是否存在  
  36.         boolean hasRowKeyCharlie = workHoursMap.containsKey("Charlie");  
  37.         System.out.println("Does the nested map have an entry for Charlie? " + hasRowKeyCharlie);  
  38.   
  39.         // 检查列键是否存在(需要遍历所有内部Map)  
  40.         boolean hasColumnKeyProjectD = false;  
  41.         for (Map<String, Integer> projectMap : workHoursMap.values()) {  
  42.             if (projectMap.containsKey("ProjectD")) {  
  43.                 hasColumnKeyProjectD = true;  
  44.                 break;  
  45.             }  
  46.         }  
  47.         System.out.println("Does any employee work on ProjectD? " + hasColumnKeyProjectD);  
  48.   
  49.         // 移除数据  
  50.         removeWorkHours(workHoursMap, "Alice", "ProjectB"); // Alice不再在ProjectB上工作  
  51.         System.out.println("After removal, Alice's work hours on ProjectB: " + getWorkHours(workHoursMap, "Alice", "ProjectB"));  
  52.     }  
  53.   
  54.     private static void addWorkHours(Map<String, Map<String, Integer>> workHoursMap, String rowKey, String columnKey, Integer value) {  
  55.         workHoursMap.putIfAbsent(rowKey, new HashMap<>());  
  56.         workHoursMap.get(rowKey).put(columnKey, value);  
  57.     }  
  58.   
  59.     private static Integer getWorkHours(Map<String, Map<String, Integer>> workHoursMap, String rowKey, String columnKey) {  
  60.         Map<String, Integer> projectMap = workHoursMap.get(rowKey);  
  61.         return projectMap != null ? projectMap.get(columnKey) : null;  
  62.     }  
  63.   
  64.     private static void setWorkHours(Map<String, Map<String, Integer>> workHoursMap, String rowKey, String columnKey, Integer value) {  
  65.         workHoursMap.putIfAbsent(rowKey, new HashMap<>());  
  66.         workHoursMap.get(rowKey).put(columnKey, value);  
  67.     }  
  68.   
  69.     private static boolean containsWorkHours(Map<String, Map<String, Integer>> workHoursMap, String rowKey, String columnKey) {  
  70.         Map<String, Integer> projectMap = workHoursMap.get(rowKey);  
  71.         return projectMap != null && projectMap.containsKey(columnKey);  
  72.     }  
  73.   
  74.     private static void removeWorkHours(Map<String, Map<String, Integer>> workHoursMap, String rowKey, String columnKey) {  
  75.         Map<String, Integer> projectMap = workHoursMap.get(rowKey);  
  76.         if (projectMap != null) {  
  77.             projectMap.remove(columnKey);  
  78.             if (projectMap.isEmpty()) {  
  79.                 workHoursMap.remove(rowKey);  
  80.             }  
  81.         }  
  82.     }  
复制代码
四、Guava Table的优势

使用Guava的Table而不是嵌套的Map有几个优势:

  • 类型安全:Table明确指定了行键、列键和值的类型,减少了类型转换的错误。
  • 更易用:Table提供了直观的API来插入、检索和遍历数据,使代码更易于阅读和维护。
  • 内存效率:Table实现类针对其特定用途进行了优化,以提供高效的内存使用。
  • 不变性:通过ImmutableTable可以创建不可变的表格,对并发编程和不可变对象模式非常有用。



相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-11-24 00:42

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表