Table集合
2016-02-26 16:52
190 查看
当需要多个索引的数据结构的时候,通常情况下,会用到Map<key1, Map<value1, value>>来实现。
如下构建 <year,<month, LocalDate>> 的数据结构:
Guava提供Table集合类型,来满足这种使用场景。Table支持“row”和“column”,而且提供多种视图。
运行结果:
Table其它操作:
rowMap()返回一个Map<R, Map<C, V>>的视图。rowKeySet()类似地返回一个Set<R>。
row(r)返回一个非null的Map<C, V>。修改这个视图Map也会导致原表格的修改。和列相关的方法有columnMap(), columnKeySet()和column(c)。(基于列的操作会比基于行的操作效率差些)。
cellSet()返回的是以Table.Cell<R, C, V>为元素的Set。这里的Cell就类似Map.Entry,但是它是通过行和列来区分的。
Table有以下实现:
HashBasedTable:基于HashMap<R, HashMap<C, V>>的实现。
TreeBasedTable:基于TreeMap<R, TreeMap<C, V>>的实现。
ImmutableTable:基于ImmutableMap<R, ImmutableMap<C, V>>的实现。(ImmutableTable已对稀疏和密集集合做了优化)。
ArrayTable:ArrayTable是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。
如下构建 <year,<month, LocalDate>> 的数据结构:
Map<String, Map<String, LocalDate>> dateMap = new HashMap<>(); for (int i = 2015; i <= 2016; i++) { for (int j = 1; j < 3; j++) { Map<String, LocalDate> map = dateMap.get(String.valueOf(i)); if (map == null) { map = new HashMap<>(); dateMap.put(String.valueOf(i), map); } map.put(String.valueOf(j), LocalDate.of(2016, Month.of(j), 01)); } } System.out.println(dateMap);可以看出,这里需要有null判断,比较繁琐。
Guava提供Table集合类型,来满足这种使用场景。Table支持“row”和“column”,而且提供多种视图。
//rowKey, columnKey, valueObject Table<String, String, LocalDate> dateTable = HashBasedTable.create(); for (int i = 2015; i <= 2016; i++) { for (int j = 1; j < 3; j++) { dateTable.put(String.valueOf(i), String.valueOf(j), LocalDate.of(i, Month.of(j), 01)); } } Map<String, Map<String, LocalDate>> dateMap = dateTable.rowMap(); System.out.println(dateMap); System.out.println("year=2015 ---> " + dateTable.row("2015")); System.out.println("month=1 ---> " + dateTable.column("1")); System.out.println("year=2015 and month=1 ---> " + dateTable.get("2015", "1")); System.out.println("containsColumn(3) ---> " + dateTable.containsColumn(3)); System.out.println("containsRow(2014) ---> " + dateTable.containsRow("2014")); System.out.println("columnMap ---> " + dateTable.columnMap()); System.out.println("rowMap ---> " + dateTable.rowMap()); System.out.println(dateTable.remove("2015", 1));
运行结果:
{2016={1=2016-01-01, 2=2016-02-01}, 2015={1=2015-01-01, 2=2015-02-01}} year=2015 ---> {1=2015-01-01, 2=2015-02-01} month=1 ---> {2016=2016-01-01, 2015=2015-01-01} year=2015 and month=1 ---> 2015-01-01 containsColumn(3) ---> false containsRow(2014) ---> false columnMap ---> {1={2016=2016-01-01, 2015=2015-01-01}, 2={2016=2016-02-01, 2015=2015-02-01} } rowMap ---> {2016={1=2016-01-01, 2=2016-02-01}, 2015={1=2015-01-01, 2=2015-02-01}} null可以看出使用guava的Table要比上一个例子简洁很多。
Table其它操作:
rowMap()返回一个Map<R, Map<C, V>>的视图。rowKeySet()类似地返回一个Set<R>。
row(r)返回一个非null的Map<C, V>。修改这个视图Map也会导致原表格的修改。和列相关的方法有columnMap(), columnKeySet()和column(c)。(基于列的操作会比基于行的操作效率差些)。
cellSet()返回的是以Table.Cell<R, C, V>为元素的Set。这里的Cell就类似Map.Entry,但是它是通过行和列来区分的。
Table有以下实现:
HashBasedTable:基于HashMap<R, HashMap<C, V>>的实现。
TreeBasedTable:基于TreeMap<R, TreeMap<C, V>>的实现。
ImmutableTable:基于ImmutableMap<R, ImmutableMap<C, V>>的实现。(ImmutableTable已对稀疏和密集集合做了优化)。
ArrayTable:ArrayTable是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。
相关文章推荐
- 通过设置AUTO_INCREMENT设置自增起始值
- java操作 oracle 的 blob和clob类型
- 关于一个关系型数据库的实现原理参考
- Python语言特性
- 途牛原创|XMPP协议在途牛APP中的应用实践
- C++内存的理解
- linux配置java环境变量3中方式
- MPAndroidChart饼图属性及相关设置
- top 10 tipis on Logging in Java- Tutorial (翻译)
- 弹弹堂之 弹坑技术( 鱼儿游 )
- excel输入数字变成特殊符号问题
- 使用python的redis 实现消息的pub/sub功能
- MapReduce中的分布式缓存使用
- java 泛型初探
- 《leetCode》:Path Sum II
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?