guava-集合
阿新 • • 發佈:2018-11-21
結構
不變
python
中一種結構,叫做元組
。
能切片,能遍歷,能迭代,就是不能修改。
guava
中也有,好處多多,而且底層做了更多,效率更高。
不能修改,僅此而已。
JDK | Guava |
---|---|
Collection |
ImmutableCollection |
List |
ImmutableList |
Set |
ImmutableSet |
SortedSet |
ImmutableSortedSet |
Map |
ImmutableMap |
SortedMap |
ImmutableSortedMap |
- 構造
方法(Immutable* ) |
說明 |
---|---|
of |
收集組合 |
copyOf |
從資料集生成 |
sortedCopyOf |
先排序,後生成 |
builder |
構造器 |
Immutable*
,看使用的是啥資料結構。
List
的話就是ImmutableList
。
ImmutableList.of(1,2,3,4,5,6,7,8,9).asList();
ImmutableList.copyOf(new Integer[]{1,2,3,4,5,6,7,8,9}).asList();
ImmutableList.copyOf(Arrays.asList(1,2,3,4,5,6,7,8,9)).asList();
ImmutableList.builder()
. add(1)
.add(2,3,4)
.add(new Integer[]{5,6})
.addAll(Arrays.asList(7,8,9))
.build().asList();
單個的,陣列,迭代物件,都可以。
asList
返回的結構,比一般效率還會更高。
- 其他
使用的話,
contains
,get
…和基本的使用方法一致。
- 更多
新結構 | 不變結構 |
---|---|
Multiset |
ImmutableMultiset |
SortedMultiset |
ImmutableSortedMultiset |
Multimap |
ImmutableMultimap |
ListMultimap |
ImmutableListMultimap |
SetMultimap |
ImmutableSetMultimap |
BiMap |
ImmutableBiMap |
ClassToInstanceMap |
ImmutableClassToInstanceMap |
Table |
ImmutableTable |
這些都是guava
中的新結構,後面敘述。
Multiset
- 實現類
類別 | 底層實現 | 支援null |
---|---|---|
HashMultiset |
HashMap |
true |
TreeMultiset |
TreeMap |
true 看 compartor 是否支援 |
LinkedHashMultiset |
LinkedHashMap |
true |
ConcurrentHashMultiset |
ConcurrentHashMap |
false |
ImmutableMultiset |
ImmutableMap |
false |
- 相關方法
方法 | 描述 |
---|---|
count(E) |
計數 |
elementSet() |
元素set |
entrySet() |
鍵值對set |
add(E, int) |
增加計數 |
remove(E, int) |
減少計數 |
setCount(E, int) |
設定計數 不可為負 |
size() |
數量 |
addAll(iterator) |
新增全部 |
- 實驗
public static void main(String[] args) {
HashMultiset<Integer> integers = HashMultiset.create();
integers.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9,1,2,3,4,8,9));
integers.forEach(value-> System.out.println("value : " + value + "\tcount : " + integers.count(value)));
}
可以看到,不會真的是
set
,仍然有重複。
public static void main(String[] args) {
HashMultiset<Integer> integers = HashMultiset.create();
integers.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9,1,2,3,4,8,9));
integers
.elementSet()
.forEach(value-> System.out.println("value : " + value + "\tcount : " + integers.count(value)));
}
去重效果更佳。
SortedMultiset
特異化結構,排序後加速範圍限定查詢。
Multimap
Map<K, List>
,這個結構用的不會少。
一對多不會只有資料庫才會存在,不過Map<K, List>
是真的蠢。
於是Multimap
出現了。
- 實現類
實現類 | key 行為 |
value 行為 |
---|---|---|
ArrayListMultimap |
HashMap |
ArrayList |
HashMultimap |
HashMap |
HashSet |
LinkedListMultimap* |
LinkedHashMap* |
LinkedList* |
LinkedHashMultimap** |
LinkedHashMap |
LinkedHashMap |
TreeMultimap |
TreeMap |
TreeSet |
ImmutableListMultimap |
ImmutableMap |
ImmutableList |
ImmutableSetMultimap |
ImmutableMap |
ImmutableSet |
key
和value
到底是什麼結構的呢,自己取捨吧。
- 方法
方法 | 作用 |
---|---|
get(key) |
獲取value |
put(K, V) |
增加單個value |
putAll(K, Iterabl e) |
增加多個value |
remove(K, V) |
移除單個value |
removeAll(K) |
移除多個value |
replaceValues(K, Ite rable) |
替換value |
asMap |
轉換為Map |
entries |
鍵值對 |
keySet |
鍵集合 |
keys |
鍵列表 |
values() |
值列表 |
- 實驗
public static void main(String[] args) {
HashMultimap<String, String> hashMultimap = HashMultimap.create();
hashMultimap.put("godme", "人民銀行");
hashMultimap.put("godme", "招商銀行");
hashMultimap.keySet().forEach(item -> {
hashMultimap.get(item).forEach(item2 -> {
System.out.println("account : " + item + "\tbank : " + item2);
});
});
}
更多辦法,需要再自測。
*
有特殊操作,可以自行查閱文件,支援
BiMap
一般時候都是key->value
,不過有時候也需要value->key
。
不過維護兩個Map
實在操蛋,現在方便多了。
- 實現類
實現 | key->value |
value->key |
---|---|---|
HashBiMap |
HashMap |
HashMap |
ImmutableBiMap |
ImmutableMap |
ImmutableMap |
EnumBiMap |
EnumMap |
EnumMap |
EnumHashBiMap |
EnumMap |
EnumMap |
- 使用
public static void main(String[] args) {
HashBiMap<String, String> map = HashBiMap.create();
map.forcePut("key", "value");
System.out.println(map.inverse().get("value"));
}
更多操作辦法…可以翻原始碼。
記住就行,用到會查就行,記太多也不一定用到。
table
public static void main(String[] args) {
HashBasedTable<Integer,Integer ,Integer> table = HashBasedTable.create();
table.put(1,1,11);
table.put(2,2,22);
table.column(1).put(2, 21);
table.row(1).put(2, 12);
System.out.println(table);
}
row/column | 1 | 2 |
---|---|---|
1 | 11 | 12 |
2 | 21 | 22 |
反正我還用不到,看著就蛋疼。
ClassToInstanceMap
public static void main(String[] args) {
MutableClassToInstanceMap<Integer> table = MutableClassToInstanceMap.create();
table.put(Integer.class, 12);
table.put(Integer.class, 34);
table.put(Integer.class, 56);
table.put(Integer.class, 78);
System.out.println(table.get(Integer.class));
}
單例模式麼這個,用不上。
RangeSet
public static void main(String[] args) {
TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1,2));
rangeSet.add(Range.closed(2,3));
rangeSet.add(Range.open(3,4));
rangeSet.add(Range.closedOpen(5,6));
rangeSet.add(Range.openClosed(7,8));
System.out.println(rangeSet);
}
數軸區間啊這是。
- 查詢
方法 | 作用 |
---|---|
contains(C) |
區間是否包含元素 |
rangeContaining(C) |
返回包含區間 不包含回 null |
encloses(Range) |
區間是否包含區間 |
span() |
最小區間 |
- 操作
方法 | 作用 |
---|---|
complement() |
補集 |
subRangeSet(Range) |
交集 |
asRanges() |
Range-SetRange 的set |
RangeMap
rangeMap.put(Range.open(3, 6), "bar");
- 為指定區間打標記。
- 區間交集不合並
- 方法
方法 | 作用 |
---|---|
asMapOfRanges() |
Range-Map |
subRangeMap(Range) |
交集 |
工具
Iterables
方法 | 連線 |
---|---|
concat(Iterable) |
連線 |
frequency(Iterable, Object) |
統計 |
partition(Iterable, in t) |
拆分 |
elementsEqual(Iterable, Iterable) |
比較 |
limit(Iterable, int) |
限制 |
addAll(Collection addT o, Iterable toAdd) |
新增 |
contains(Iterable, Object) |
包含 |
更多方法自己查閱,畢竟結構體都不熟悉,看這些未免有點畫蛇添足。
自定義
裝飾(Forwarding*
)
public class Null {
public static void main(String[] args) {
MyList list = new MyList<Integer>(56);
}
public static class MyList<T> extends ForwardingList {
private ArrayList<T> sourceStruct;
public MyList(int size) {
sourceStruct = new ArrayList(size);
}
@Override
protected List delegate() {
return sourceStruct;
}
}
}
delegate
:返回一個根源的資料管理物件即可
然後根據想攔截的方法進行改造即可。
Forwarding*
:固定字首,後面可選好多結構體
AbstractIterator
new AbstractIterator<Integer>(){
@Override
protected Integer computeNext() {
return null;
}
};
內嵌一下,包裝一下。
不過我感覺第一個就夠我用了,其他的不看了。
總結
水平不夠,我用得上的就是那些新結構。
太高深的也用不上,更別說一些操作方法。
不用就說不上理解,脫離了實際使用都是空中樓閣。
先把那些蠢笨的辦法換成流暢的資料結構再說吧。