Table
当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的 Map<FirstName, Map<LastName, Person>>来实现。为此Guava提供了一个新的集合类型-Table集合类型,来支持这种数据结构的使用场景。Table支持“row”和“column”,而且提供多种视图。 @Test public void TableTest(){ Table<String, Integer, String> aTable = HashBasedTable.create(); for (char a = 'A'; a <= 'C'; ++a) { for (Integer b = 1; b <= 3; ++b) { aTable.put(Character.toString(a), b, String.format("%c%d", a, b)); } } System.out.println(aTable.column(2)); System.out.println(aTable.row("B")); System.out.println(aTable.get("B", 2)); System.out.println(aTable.contains("D", 1)); System.out.println(aTable.containsColumn(3)); System.out.println(aTable.containsRow("C")); System.out.println(aTable.columnMap()); System.out.println(aTable.rowMap()); System.out.println(aTable.remove("B", 3)); } 输出: {A=A2, B=B2, C=C2} {1=B1, 2=B2, 3=B3} B2 false true true {1={A=A1, B=B1, C=C1}, 2={A=A2, B=B2, C=C2}, 3={A=A3, B=B3, C=C3}} {A={1=A1, 2=A2, 3=A3}, B={1=B1, 2=B2, 3=B3}, C={1=C1, 2=C2, 3=C3}} B3 Table视图: Table有以下实现: ClassToInstanceMap 有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,guava提供了ClassToInstanceMap满足了这个目的。 ClassToInstanceMap<Number> numberDefaults = MutableClassToInstanceMap.create(); numberDefaults.putInstance(Integer.class, Integer.valueOf(0)); 从技术上来说,ClassToInstanceMap<B> 实现了Map<Class<? extends
B>,
B>,或者说,这是一个从B的子类到B对象的映射,这可能使得ClassToInstanceMap的泛型轻度混乱,但是只要记住B总是Map的上
层绑定类型,通常来说B只是一个对象。 import org.junit.Test; import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.HashBasedTable; import com.google.common.collect.MutableClassToInstanceMap; RangeSet RangeSet用来处理一系列不连续,非空的range。当添加一个range到一个RangeSet之后,任何有连续的range将被自动合并,而空的range将被自动去除。例如: @Test public void RangeSetTest(){ RangeSet<Integer> rangeSet = TreeRangeSet.create(); rangeSet.add(Range.closed(1, 10)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.closedOpen(11, 15)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.open(15, 20)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.openClosed(0, 0)); System.out.println("rangeSet:"+rangeSet); rangeSet.remove(Range.open(5, 10)); System.out.println("rangeSet:"+rangeSet); } 输出: rangeSet:{[1‥10]} rangeSet:{[1‥10][11‥15)} rangeSet:{[1‥10][11‥15)(15‥20)} rangeSet:{[1‥10][11‥15)(15‥20)} rangeSet:{[1‥5][10‥10][11‥15)(15‥20)} 注意,像合并Range.closed(1, 10)和Range.closedOpen(11, 15)这样的情况,我们必须先用调用Range.canonical(DiscreteDomain)传入DiscreteDomain.integers()处理一下。 RangeSet的视图 RangeMap @Test public void RangeMapTest(){ RangeMap<Integer, String> rangeMap = TreeRangeMap.create(); rangeMap.put(Range.closed(1, 10), "foo"); System.out.println("rangeMap:"+rangeMap); rangeMap.put(Range.open(3, 6), "bar"); System.out.println("rangeMap:"+rangeMap); rangeMap.put(Range.open(10, 20), "foo"); System.out.println("rangeMap:"+rangeMap); rangeMap.remove(Range.closed(5, 11)); System.out.println("rangeMap:"+rangeMap); } 输出: rangeMap:[[1‥10]=foo] rangeMap:[[1‥3]=foo, (3‥6)=bar, [6‥10]=foo] rangeMap:[[1‥3]=foo, (3‥6)=bar, [6‥10]=foo, (10‥20)=foo] rangeMap:[[1‥3]=foo, (3‥5)=bar, (11‥20)=foo] RangeMap的视图 |
|
来自: 贾朋亮博客 > 《Guava学习笔记》