美文网首页
guava MutilSet Multimap BiMap

guava MutilSet Multimap BiMap

作者: hehehehe | 来源:发表于2020-12-29 18:46 被阅读0次

    Guava中定义的新集合有:
    Multiset
    SortedMultiset
    Multimap
    ListMultimap
    SetMultimap
    BiMap
    ClassToInstanceMap
    Table

    Multiset

    Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。
    Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计

    public void testMultsetWordCount(){
            String strWorld="wer|dfd|dd|dfd|dda|de|dr";
            String[] words=strWorld.split("\\|");
            List<String> wordList=new ArrayList<String>();
            for (String word : words) {
                wordList.add(word);
            }
            Multiset<String> wordsMultiset = HashMultiset.create();
            wordsMultiset.addAll(wordList);     
            for(String key:wordsMultiset.elementSet()){
                System.out.println(key+" count:"+wordsMultiset.count(key));
            }
        }
    
    Multiset接口定义的接口主要有:
        add(E element) :向其中添加单个元素
        add(E element,int occurrences) : 向其中添加指定个数的元素
        count(Object element) : 返回给定参数元素的个数
        remove(E element) : 移除一个元素,其count值 会响应减少
        remove(E element,int occurrences): 移除相应个数的元素
        elementSet() : 将不同的元素放入一个Set中
        entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
        setCount(E element ,int count): 设定某一个元素的重复次数
        setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
        retainAll(Collection c) : 保留出现在给定集合参数的所有的元素
        removeAll(Collectionc) : 去除出现给给定集合参数的所有的元素
    

    Guava提供了Multiset的多种实现,这些实现基本对应了JDK中Map的实现:

    Map                   Corresponding Multiset   Supports null elements
    HashMap               HashMultiset                Yes
    TreeMap               TreeMultiset                Yes (if the comparator does)
    LinkedHashMap         LinkedHashMultiset          Yes
    ConcurrentHashMap     ConcurrentHashMultiset      No
    ImmutableMap          ImmutableMultiset           No
    

    Multimap

    Map<K, List<V>>或者Map<K, Set<V>>

    Multimap也支持一系列强大的视图功能:
    1.asMap把自身Multimap<K, V>映射成Map<K, Collection<V>>视图。这个Map视图支持remove和修改操作,但是不支持put和putAll。严格地来讲,当你希望传入参数是不存在的key,而且你希望返回的是null而不是一个空的可修改的集合的时候就可以调用asMap().get(key)。(你可以强制转型asMap().get(key)的结果类型-对SetMultimap的结果转成Set,对ListMultimap的结果转成List型-但是直接把ListMultimap转成Map<K, List<V>>是不行的。)
    2.entries视图是把Multimap里所有的键值对以Collection<Map.Entry<K, V>>的形式展现。
    3.keySet视图是把Multimap的键集合作为视图
    4.keys视图返回的是个Multiset,这个Multiset是以不重复的键对应的个数作为视图。这个Multiset可以通过支持移除操作而不是添加操作来修改Multimap。
    5.values()视图能把Multimap里的所有值“平展”成一个Collection<V>。这个操作和Iterables.concat(multimap.asMap().values())很相似,只是它返回的是一个完整的Collection。
    
    尽管Multimap的实现用到了Map,但Multimap<K, V>不是Map<K, Collection<V>>。因为两者有明显区别:
    1.Multimap.get(key)一定返回一个非null的集合。但这不表示Multimap使用了内存来关联这些键,相反,返回的集合只是个允许添加元素的视图。
    2.如果你喜欢像Map那样当不存在键的时候要返回null,而不是Multimap那样返回空集合的话,可以用asMap()返回的视图来得到Map<K, Collection<V>>。(这种情况下,你得把返回的Collection<V>强转型为List或Set)。
    3.Multimap.containsKey(key)只有在这个键存在的时候才返回true。
    4.Multimap.entries()返回的是Multimap所有的键值对。但是如果需要key-collection的键值对,那就得用asMap().entries()。
    5.Multimap.size()返回的是entries的数量,而不是不重复键的数量。如果要得到不重复键的数目就得用Multimap.keySet().size()。
    

    Multimap的实现

    Multimap提供了丰富的实现,所以你可以用它来替代程序里的Map<K, Collection<V>>,具体的实现如下:
    Implementation            Keys 的行为类似          Values的行为类似
    ArrayListMultimap         HashMap                     ArrayList
    HashMultimap               HashMap                     HashSet
    LinkedListMultimap        LinkedHashMap*              LinkedList*
    LinkedHashMultimap        LinkedHashMap                LinkedHashSet
    TreeMultimap                TreeMap                     TreeSet
    ImmutableListMultimap     ImmutableMap                 ImmutableList
    ImmutableSetMultimap      ImmutableMap                 ImmutableSet
    
    

    以上这些实现,除了immutable的实现都支持null的键和值。
    1.LinkedListMultimap.entries()能维持迭代时的顺序。

    2.LinkedHashMultimap维持插入的顺序,以及键的插入顺序。
    要注意并不是所有的实现都正真实现了Map<K, Collection<V>>!(尤其是有些Multimap的实现为了最小话开销,使用了自定义的hash table)

    BiMap

    BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。
    们在使用Java的Map时,往往是通过key来查找value的,

    Bimap数据的强制唯一性

    在使用BiMap时,会要求Value的唯一性。如果value重复了则会抛出错误:java.lang.IllegalArgumentException,例如

    理解inverse方法

    inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。例如:

    BiMap的实现类
    Key-Value Map Impl     Value-Key Map Impl     Corresponding BiMap
    HashMap                     HashMap                       HashBiMap
    ImmutableMap             ImmutableMap               ImmutableBiMap
    EnumMap                    EnumMap                      EnumBiMap
    EnumMap                    HashMap                       EnumHashBiMap
    

    相关文章

      网友评论

          本文标题:guava MutilSet Multimap BiMap

          本文链接:https://www.haomeiwen.com/subject/xmrqoktx.html