1. 程式人生 > >guava-集合

guava-集合

結構

不變

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返回的結構,比一般效率還會更高。

  • 其他

使用的話,containsget…和基本的使用方法一致。

  • 更多
新結構 不變結構
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

keyvalue到底是什麼結構的呢,自己取捨吧。

  • 方法
方法 作用
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);
            });
        });
    }

更多辦法,需要再自測。

*有特殊操作,可以自行查閱文件,支援PDF下載哦。

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-Set
Rangeset

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;
            }
        };

內嵌一下,包裝一下。

不過我感覺第一個就夠我用了,其他的不看了。

總結

水平不夠,我用得上的就是那些新結構。

太高深的也用不上,更別說一些操作方法。

不用就說不上理解,脫離了實際使用都是空中樓閣。

先把那些蠢笨的辦法換成流暢的資料結構再說吧。