Table集合

当需要多个索引的数据结构的时候,通常情况下,会用到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, 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是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。

你可能感兴趣的:(Table集合)