美文网首页
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