guava集合下四 -新的集合類型

guava中產生了jdk中沒有的新集合,並且是普遍使用的,這些都能和jdk中集合框架共存,沒有將這些硬結合到jdk的抽象集合。java

一般,guava集合實現了jdk的接口,緊密的結合到了一塊兒框架

 

 

Multiset 和傳統中集合比較

傳統的java中統計文檔中單詞出現的次數的方式以下:ui

String []words=new String[5000];spa

Map<String,Integer> counts=new HashMap<String,Integer>();對象

for(String word:words){接口

Integer count=counts.get(word);隊列

if(count==null){ci

counts.put(word,1);element

}else {開發

counts.put(word,count+1);

}

}

這樣的寫法,不支持各類有用的統計,比方說總量,咱們可以作的更好。

guava 提供了新的類型multiset,支持添加多種元素,在統計學中,是集合概念的衍生物,容許其中的元素能夠出現屢次。在multiset中和在tuples中相反,元素的順序是不相關的,{a,a,b}和{a,b,a}是相同的

 

有兩種看待問題的方式:

1.這是一個隊列,其中元素的順序沒有關係

2.這是一個map,有元素和個數

 

guava's MultisetAPI將兩種想法結合到一塊兒:

看成普通的集合時,Multiset像一個和順序無關的arraylist:

1.調用add(E) 時增長指定元素

2.迭代器遍歷每個出現的元素

3.size()方法返回的是全部元素全部的出現次數

 

另外的查詢操做,統計方式,和Map<E,Integer>中所指望的一致

count(object) 返回和元素相關的個數,如hashMultiset 統計的時間複雜度爲O(1),對於TreeMultiset,統計的時間複雜度是O(log n).

entrySet() 返回一個Set<Multiset.Entry<E>> ,和map中的entrySet相似

multiset所消耗的空間複雜度是線性的,和其中惟一元素的個數有關

 

毫無疑問,multiset和collection接口有關,TreeMultiSet和TreeSet相似,相對jdk而言使用起來更加簡單

 

MultiSet 不是一個map

Multiset<E> 不是一個Map<E,Integer>,雖然可能有一部分相關的實現,Multiset是一個Collection 類型,知足全部已經定義的

方式,其餘明顯的不一樣體如今下面幾點:

multiset<E> 只有正數的數量,沒有元素的count屬性返回的爲負數類型,若是count的值爲0表示multiset中沒有相關的元素,這個值也不會出如今elementSet()和entrySet()中

multiset.size() 返回集合中全部元素個數,對於每一個元素的個數類型可使用elementSet().size()

multiset.iterator 迭代器遍歷每個出現的元素,因此迭代的大小和multiset.size()相等

multiset<E>支持添加元素,移除元素,或直接設置元素的個數,setCount(ele,0)和移除集合中的相關全部元素方法效果一致

multiset.count(elem) 若是相關集合中沒有元素返回0

 

jdk和guava中元素徹底適配

sortedMultiset

 

sortedMultiset是multiset接口的演變,支持指定範圍的子集合構造,例如,可使用latencies.subMultiset(0,BoudType.CLOSED,100,BoundType.OPEN).size() 查詢出在100毫秒內相關的數據,並經過.size()方法計算出相關的比例.

TreeMultiset實現了sortedMultiset.

 

 

 

Multimap

每個開發人員都哦會經歷這樣的問題,實現了Map<K,List<V>> or Map<K,Set<V>> ,還得處理這樣複雜的結構

例如,Map<K,Set<V>> 一種特殊的方式處理未標記的有向圖。Guava's Multimap結構讓處理keys 映射多個values處理更加簡單

 

 

有兩種方式考慮Multimap的概念:是一個key到value的映射

 

a -> 1 a -> 2 a -> 4 b -> 3 c -> 5

 

或者是從一個惟一key到多個value集合的映射

a -> [1, 2, 4] b -> [3] c -> [5]

 

不多直接使用Multimap接口,常用ListMultimap 或者SetMultimap,分別映射keys到list或set

 

construction 構建

 

 

直接建立Multimao是使用MultimapBuilder ,指定kes和values是如何使用的

 

// creates a ListMultimap with tree keys and array list values ListMultimap<String, Integer> treeListMultimap = MultimapBuilder.treeKeys().arrayListValues().build(); // creates a SetMultimap with hash keys and enum set values SetMultimap<Integer, MyEnum> hashEnumMultimap = MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();

 

modifying 修改

multimap.get(key) 返回與key相關的list或者set

修改

Set<Person> aliceChildren = childrenMultimap.get(alice); aliceChildren.clear(); aliceChildren.add(bob); aliceChildren.add(carol);

 

multimap支持一些其餘有用方法

asMap 將每個Multiamp<K,V>看做一個Map<K,Collection<V>> ,返回的map支持

remove和返回集合對象的修改,可是不支持put和putall方法,可使用asMap().get(key)

獲取null而不是一個新的,可寫入的空的集合,同時也有相關集合的轉化 Set 和MultiSet

List和ListMultimap 可是不容許ListMultimap返回一個Map<K,List<V>>類型

 

 

entries 實體 Collection<Map,Entry<K,V>> 返回全部Multimap中的實體

keySet 返回Multimap中的惟一的set集合;

keys返回multimap中全部的key存爲一個multiset,可以刪除,可是不可以添加

values() 返回全部的集合信息

 

BiMap

BiMap時一個 Map<K,V>

容許你反過來使用 BiMap<V,K> 經過inverser()

保證值是惟一的,values()是一個Set

 

若是放入一個已經存在的key,則會拋出異常,若是想要刪除存在的實體,使用forcePut(key,value)代替

BiMap<String,Integer> userId= HashBiMap.create();

String userForId=userId.inverse().get(2);

 

 

Table

當要同時使用多個key的時候,可能用到的結構是Map<FirstName,Map<LaseName,Person>>,這樣的結構看起來

很難使用,guava提供了新的集合類型table,支持row類型和column類型,table支持多角度去使用數據

 

 

rowMap 將Table<R,C,V> 當作是Map<R,Map<C,V>>,rowKeySet()返回Set<R>

row(r) 返回非空的Map<C,V>,

 

不少類型的table實現

HashBasedTable

TreeBasedTable

 

ImmutableTable

ArrayTable

 

ClassToINstanceMap

map keys有時候不是同一種類型,想要匹配相關的值,guava提供了相關的類型

ClassToInstanceMap

除了實現map接口,ClassTOINstanceMap提供了 T getInstance(Class<T>) 和T putINstance(Class<T> ,T)。

ClassToInstanceMap有一個單獨的類型參數,叫作B,表明了map中指定的相關類型

ClassToInstanceMap<Number> numberDefaults=MutableClassToInstanceMap.create();

numberDefaults.putInstance(Integer.class,Integer.valueOf(0));

}

 

 

RangeSet

一個rangeSet表示一個不連續的,非空的區間值。當添加一個區間的數值到rangeSet,其餘範圍的值就會鏈接到一塊兒,空的範圍就會被忽略

RangeMap

相關文章
相關標籤/搜索