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