1. 程式人生 > >Guava學習筆記:Guava新集合-Table等

Guava學習筆記:Guava新集合-Table等

  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檢視:
  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是一個需要在構建的時候就需要定下行列的表格。這種表格由二維陣列實現,這樣可以在密集資料的表格的場合,提高時間和空間的效率。

  ClassToInstanceMap

  有的時候,你的map的key並不是一種型別,他們是很多型別,你想通過對映他們得到這種型別,guava提供了ClassToInstanceMap滿足了這個目的。
  除了繼承自Map介面,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了強制型別轉換。
  該類有一個簡單型別的引數,通常稱為B,代表了map控制的上層繫結,例如:

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只是一個物件。
  guava提供了有用的實現, MutableClassToInstanceMap 和 ImmutableClassToInstanceMap.
  重點:像其他的Map<Class,Object>,ClassToInstanceMap 含有的原生型別的專案,一個原生型別和他的相應的包裝類可以對映到不同的值;

import org.junit.Test;

import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.MutableClassToInstanceMap;
public class OtherTest { @Test public void ClassToInstanceMapTest() { ClassToInstanceMap<String> classToInstanceMapString =MutableClassToInstanceMap.create(); ClassToInstanceMap<Person> classToInstanceMap =MutableClassToInstanceMap.create(); Person person= new Person("peida",20); System.out.println("person name :"+person.name+" age:"+person.age); classToInstanceMapString.put(String.class, "peida"); System.out.println("string:"+classToInstanceMapString.getInstance(String.class)); classToInstanceMap.putInstance(Person.class,person); Person person1=classToInstanceMap.getInstance(Person.class); System.out.println("person1 name :"+person1.name+" age:"+person1.age); } } class Person { public String name; public int age; Person(String name, int age) { this.name = name; this.age = age; } } 

  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的檢視
  RangeSet的實現支援了十分豐富的檢視,包括:
  complement():是個輔助的RangeSet,它本身就是一個RangeSet,因為它包含了非連續,非空的range。
  subRangeSet(Range<C>): 返回的是一個交集的檢視。
  asRanges():返回可以被迭代的Set<Range<C>>的檢視。
  asSet(DiscreteDomain<C>) (ImmutableRangeSet only):返回一個ImmutableSortedSet<C>型別的檢視,裡面的元素是range裡面的元素,而不是range本身。(如果DiscreteDomain和RangeSet的上限或下限是無限的話,這個操作就不能支援)

  Queries
  除了支援各種檢視,RangeSet還支援各種直接的查詢操作,其中最重要的是:
  contains(C):這是RangeSet最基本的操作,它能查詢給定的元素是否在RangeSet裡。
  rangeContaining(C): 返回包含給定的元素的Range,如果不存在就返回null。
  encloses(Range<C>): 用來判斷給定的Range是否包含在RangeSet裡面。
  span():返回一個包含在這個RangeSet的所有Range的並集。

  RangeMap
  RangeMap代表了非連續非空的range對應的集合。不像RangeSet,RangeMap不會合並相鄰的對映,甚至相鄰的range對應的是相同的值。例如:

    @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的檢視
  RangeMap提供了兩種檢視:
  asMapOfRanges():返回Map<Range<K>, V>型別的檢視。這個操作可以被用作迭代操作。
  subRangeMap(Range<K>)提供給定Range的交集。這個操作可以推廣到傳統的headMap, subMap, 和tailMap。

相關推薦

Guava學習筆記Guava集合-Table

  Table  當我們需要多個索引的資料結構的時候,通常情況下,我們只能用這種醜陋的Map<FirstName, Map<LastName, Person>>來實現。為此Guava提供了一個新的集合型別-Table集合型別,來支援這種資料結構的使用場景。Table支援“row”和“

Guava學習筆記Guava新增集合型別-Multiset

  Guava引進了JDK裡沒有的,但是非常有用的一些新的集合型別。所有這些新集合型別都能和JDK裡的集合平滑整合。Guava集合非常精準地實現了JDK定義的介面。Guava中定義的新集合有:  Multiset  SortedMultiset  Multimap  ListMultimap  SetMult

Guava學習筆記Guava新增集合型別-Multimap

  在日常的開發工作中,我們有的時候需要構造像Map<K, List<V>>或者Map<K, Set<V>>這樣比較複雜的集合型別的資料結構,以便做相應的業務邏輯處理。例如: import java.util.ArrayList; import java

Guava學習筆記Guava新增集合型別-Bimap

  BiMap提供了一種新的集合型別,它提供了key和value的雙向關聯的資料結構。  通常情況下,我們在使用Java的Map時,往往是通過key來查詢value的,但是如果出現下面一種場景的情況,我們就需要額外編寫一些程式碼了。首先來看下面一種表示標識序號和檔名的map結構。 @Test

Guava學習筆記Guava cache

  快取,在我們日常開發中是必不可少的一種解決效能問題的方法。簡單的說,cache 就是為了提升系統性能而開闢的一塊記憶體空間。   快取的主要作用是暫時在記憶體中儲存業務系統的資料處理結果,並且等待下次訪問使用。在日常開發的很多場合,由於受限於硬碟IO的效能或者我們自

Guava學習筆記Immutable(不可變)集合

  不可變集合,顧名思義就是說集合是不可被修改的。集合的資料項是在建立的時候提供,並且在整個生命週期中都不可改變。   為什麼要用immutable物件?immutable物件有以下的優點:     1.對不可靠的客戶程式碼庫來說,它使用安全,可以在未受信任的類庫中安全的使用這些物件    2.執行緒安全

Guava學習筆記Optional優雅的使用null

asset 不包含 你在 rgs 命名 靜態 不清晰 ces throw 在我們學習和使用Guava的Optional之前,我們需要來了解一下Java中null。因為,只有我們深入的了解了null的相關知識,我們才能更加深入體會領悟到Guava的Optional設計和使用上

Guava學習筆記Preconditions優雅的檢驗引數

在日常開發中,我們經常會對方法的輸入引數做一些資料格式上的驗證,以便保證方法能夠按照正常流程執行下去。對於可預知的一些資料上的錯誤,我們一定要做事前檢測和判斷,來避免程式流程出錯,而不是完全通過錯誤處理來保證流程正確執行,畢竟錯誤處理是比較消耗資源的方式。在平常情況下我們對引數的判斷都需要自己來逐個寫方法

Guava學習筆記EventBus

  EventBus是Guava的事件處理機制,是設計模式中的觀察者模式(生產/消費者程式設計模型)的優雅實現。對於事件監聽和釋出訂閱模式,EventBus是一個非常優雅和簡單解決方案,我們不用建立複雜的類和介面層次結構。   Observer模式是比較常用的設計模式之一,雖然有時候在具體程式碼裡,它不一定

Guava學習筆記複寫的Object常用方法

  在Java中Object類是所有類的父類,其中有幾個需要override的方法比如equals,hashCode和toString等方法。每次寫這幾個方法都要做很多重複性的判斷, 很多類庫提供了覆寫這幾個方法的工具類, Guava也提供了類似的方式。下面我們來看看Guava中這幾個方法簡單使用。   e

Guava學習筆記簡化異常處理的Throwables類

  有時候, 當我們我們捕獲異常, 並且像把這個異常傳遞到下一個try/catch塊中。Guava提供了一個異常處理工具類, 可以簡單地捕獲和重新丟擲多個異常。例如: import java.io.IOException; import org.junit.Test; import com.goog

Guava學習筆記Range

  在Guava中新增了一個新的型別Range,從名字就可以瞭解到,這個是和區間有關的資料結構。從Google官方文件可以得到定義:Range定義了連續跨度的範圍邊界,這個連續跨度是一個可以比較的型別(Comparable type)。比如1到100之間的整型資料。   在數學裡面的範圍是有邊界和無邊界之分

Guava學習筆記Ordering犀利的比較器

  Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Ordering 例項無非就是一個特殊的Comparat

Guava學習筆記(二)基礎(Joiner,Objects,Splitter及Strings)

nonnull obj expect null dto 字符 情況 core cte 添加Maven依賴 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org

Guava學習筆記(二)Google Guava (瓜娃)的API快速熟悉使用

1,大綱 讓我們來熟悉瓜娃,並體驗下它的一些API,分成如下幾個部分: IntroductionGuava Collection APIGuava Basic UtilitiesIO APICache API 2,為神馬選擇瓜娃? 瓜娃是java API蛋糕上的冰

Guava學習筆記目錄

筆記 htm 目錄 join cnblogs string com log href 源碼 Guava學習筆記(一):Maven Guava學習筆記(二):基礎(Joiner,Objects,Splitter及Strings) Guava學習筆記(三):集合 Guava學

Java學習筆記Map集合-HashMap和HashTable(01)

在面試的過程中經常會被問到一個問題,HashMap和HashTable有什麼不同?我就大概的整理了一些,與大家分享。 一、相同點 都實現了Map介面,底層都是採用的雜湊表(陣列 + 單向連結串列,在JDK1.8以後又加入了紅黑樹。即當連結串列長度大於8時,單向連結串列轉換成紅黑樹--提

python學習筆記集合set,函式基礎

1、遍歷字典     for k,v in d:     則k,v分別是字典中鍵值對的鍵和值 2、字典的推導式     比如d = {x:x**2 for x in range(10)}  &nb

h5學習筆記layui table

最近在做Layui的後臺,發現Layui這個方案也不錯,能夠快速地在後臺直接部署。相比還要配置webpack,Layui jquery體系開箱即用在一些單獨的情況下還是挺不錯的。最近整理一下現在梳理一下Table元件的用法。 一 、Table 元件 Tabl

Guava學習筆記之Joiner ,Strings,Splitter 工具例項

Guava 一.Strings 1.Strings.padEnd方法 //padEnd普全右 String a="12345"; String b=Strings.padEnd(a, 10, 'x'); System.out.println(b); 結果為:1