Table集合

来源:互联网 发布:mac os 五笔输入法 编辑:程序博客网 时间:2024/06/08 11:41
当需要多个索引的数据结构的时候,通常情况下,会用到Map<key1, Map<value1, value>>来实现。

如下构建 <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, valueObjectTable<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-01containsColumn(3) ---> falsecontainsRow(2014) ---> falsecolumnMap ---> {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是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。

0 0
原创粉丝点击