精华内容
下载资源
问答
  • multimap

    2019-11-20 22:24:39
    1、multimap的概念 multimap和map的唯一差别就是map中的key必须是唯一的,而multimap中的key是可以重复的,其底层结构及方法接口与map完全相同。 2、multimap的基本操作 使用map时,必须包含头文件以及std标准...

    1、multimap的概念
    multimap和map的唯一差别就是map中的key必须是唯一的,而multimap中的key是可以重复的,其底层结构及方法接口与map完全相同。

    2、multimap的基本操作
    使用map时,必须包含头文件以及std标准命名空间。
    (1)insert():插入数据。
    (2)erase():删除数据。
    (3)find():查找数据。
    (4)clear():数据的清空。
    (5)empty():数据的判空。
    (6)size():获取有效元素的大小。
    (7)count():获取键值中查找元素的个数。如果有返回1,否则返回0。
    (8)rbegin():在反向迭代器中表示起始元素。
    (9)rend():在反向迭代器中表示末尾元素。
    (10)operator[key]:通过键值(key)获取该key对应的value。
    (11)at(key):通过键值(key)获取该key对应的value。
    (12)lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。
    (13)upper_bound(val):返回容器中第一个值【大于】。
    (14)equal_rand(n):返回键值n和n+1的元素。
    【例】

    #include<iostream>
    #include<map>
    #include<stdlib.h>
    
    using namespace std;
    
    void TestMultimap1()
    {
        map<int, int> map1;
        map1.insert(pair<int, int>(1, 10));
        map1.insert(make_pair(2, 20));
        map1.insert(make_pair(3, 30));
        map1.insert(make_pair(4, 40));
        map1.insert(make_pair(5, 50));
        cout << "map中的元素的个数为:" << map1.size() << endl;
    
        //尝试插入key值相同,但是value不同的元素
        map1.insert(make_pair(2, 2));
        cout << "插入key值相同,但是value不同的元素后,map中的元素的个数为:" << map1.size() << endl;
        cout << "multimap中的元素有:" << endl;
        multimap<int, int> multi1;
        for (int i = 0; i < 5; i++)
        {
            multi1.insert(make_pair(i, i));
        }
        multi1.insert(make_pair(1, 10));
        multi1.insert(make_pair(2, 20));
        multi1.insert(make_pair(2, 200));
        multimap<int, int>::iterator iter = multi1.begin();
        while (iter != multi1.end())
        {
            cout << iter->first << "--->" << iter->second << endl;
            ++iter;
        }
        cout << "在multimap中key为2的元素个数:" << multi1.count(2) << endl;
        iter = multi1.lower_bound(2);
        cout << "multi1.lower_bound(2):" << iter->first << "--->" << iter->second << endl;
        iter = multi1.upper_bound(2);
        cout << "multi1.upper_bound(2):" << iter->first << "--->" << iter->second << endl;
        typedef multimap<int, int>::iterator Iter;
        pair<Iter, Iter> ret = multi1.equal_range(2);
        cout << (ret.first)->first <<"--->" << (ret.first)->second << endl;
        for (auto it = ret.first; it != ret.second; it++)
         {
            cout << it->first << "--->" << it->second << endl;
        }
        cout << (ret.second)->first << "--->" << (ret.second)->second << endl;
    }
     
    int main()
    {
        TestMultimap1();
        system("pause");
        return 0;
    }

    运行结果为:
    在这里插入图片描述

    展开全文
  • Multimap

    2018-06-25 23:51:38
    import java.util.Collections;import com.google.common.collect.ArrayListMultimap;import com.google.common.collect.Multimap;public class testMultimap { public static void main(String[] argv) { ...
    import java.util.Collections;

    import com.google.common.collect.ArrayListMultimap;
    import com.google.common.collect.Multimap;


    public class testMultimap {
        public static void main(String[] argv) {
            Multimap<String, String> myMultiMap = ArrayListMultimap.create();
            myMultiMap.put("Fruits", "Apple");
            myMultiMap.put("Fruits", "Pear");
            myMultiMap.put("Fruits", "Banana");
            myMultiMap.put("Vegetables", "eggplant");

            System.out.println("\nmyMultiMap size:" + myMultiMap.size());

            System.out.println("\nmyMultiMap.get(Fruits): " + myMultiMap.get("Fruits"));
            System.out.println("\nmyMultiMap.get(Vegetables): " + myMultiMap.get("Vegetables"));

            System.out.println("\nkeys:");
            for (String key : myMultiMap.keys()) {
                System.out.println(key);
            }

            System.out.println("\nvalues:");
            for (String value : myMultiMap.values()) {
                System.out.println(value);
            }

            myMultiMap.remove("Fruits", "Apple");
            System.out.println("\nmyMultiMap size:" + myMultiMap.size());

            myMultiMap.removeAll("Fruits");
            System.out.println("\nmyMultiMap size:" + myMultiMap.size());
        }
    }




    结果

    myMultiMap size:4
     
    myMultiMap.get(Fruits): [Apple, Pear, Banana]
     
    myMultiMap.get(Vegetables): [eggplant]
     
    keys:
    Vegetables
    Fruits
    Fruits
    Fruits
     
    values:
    eggplant
    Apple
    Pear
    Banana
     
    myMultiMap size:3
     
    myMultiMap size:1




    展开全文
  • MultiMap

    2016-07-26 17:31:00
    类关系 ArrayListMultiMap.java ...Multimap <I> | | AbstractMultimap <A> Serializable <I> |__________________________________________| | AbstractMapBasedMultimap...

    类关系

    ArrayListMultiMap.java

    Multimap <I>
    |
    |
    AbstractMultimap <A>                  Serializable <I>    
    |__________________________________________|
    |
    AbstractMapBasedMultimap <A>  
    |
    |
    AbstractListMultimap <A>              ListMultimap <I>
    |__________________________________________|
    |
    ArrayListMultiMap
    

    LinkedListMultiMap.java

    Multimap <I>
    |
    |
    AbstractMultimap <A>              ListMultimap <I>                 Serializable <I>
    |__________________________________________|______________________________|
    |
    LinkedListMultimap
    

    TreeMultimap.java

    Multimap <I>
    |
    |
    AbstractMultimap <A>                  Serializable <I>    
    |__________________________________________|
    |
    AbstractMapBasedMultimap <A>          SetMultimap <I>    
    |__________________________________________|
    |
    AbstractSetMultimap <A>              SortedSetMultimap <I>
    |__________________________________________|
    |
    AbstractSortedSetMultimap <A> 
    |
    |
    AbstractSortedKeySortedSetMultimap <A>
    |
    |
    TreeMultimap
    

    实现方法

    ArrayListMultimap

    ArrayListMultiMap.java是以ArrayList为Collection的特定实现,这个类中没有太多的实际代码,主要是createCollection()方法中特定的产生一个ArrayList作为Collection。

    AbstractListMultimap.java是AbstractMultimap的一个List专有版本,这个类和ListMultimap接口一起,将Multimap的方法都重写为List。

    AbstractMapBasedMultimap.java则是所有以Map为核心的Multimap的基本实现,这里实现了所有Multimap的方法,是最重要的一部分。

    clear方法,先将每个collection清空,再把map清空

    1 public void clear() {
    2     // Clear each collection, to make previously returned collections empty.
    3     for (Collection<V> collection : map.values()) {
    4       collection.clear();
    5     }
    6     map.clear();
    7     totalSize = 0;
    8 }

     

    put方法,我们可以发现这里的size是每多一个KV对就加1,而不是唯一Key的数量,这点和Map不同

     1 public boolean put(@Nullable K key, @Nullable V value) {
     2     Collection<V> collection = map.get(key);
     3     // 如果这是一个新key没有对应的Collection
     4     if (collection == null) {
     5       // 先根据子类实现创建一个相应的Collection
     6       collection = createCollection(key);
     7       // 将KV对加入Map中
     8       if (collection.add(value)) {
     9         totalSize++;
    10         map.put(key, collection);
    11         return true;
    12       } else {
    13         throw new AssertionError("New Collection violated the Collection spec");
    14       }
    15     // 如果已经有这个key了,就加入它的Collection
    16     } else if (collection.add(value)) {
    17       totalSize++;
    18       return true;
    19     } else {
    20       return false;
    21     }
    22 }

     

    removeAll方法,需要返回删除的Value,所以要一个临时变量存起来

     1 public Collection<V> removeAll(@Nullable Object key) {
     2     // 先将Key移出
     3     Collection<V> collection = map.remove(key);
     4     // 如果Value为空,则返回空集合
     5     if (collection == null) {
     6       return createUnmodifiableEmptyCollection();
     7     }
     8     // 否则将Value的值拷贝到输出集合中,再把Value清空
     9     Collection<V> output = createCollection();
    10     output.addAll(collection);
    11     totalSize -= collection.size();
    12     collection.clear();
    13     // 返回输出集合
    14     return unmodifiableCollectionSubclass(output);
    15 }

     

    size方法,注意这里返回的是KV数,而非K的唯一个数

    1 public int size() {
    2     return totalSize;
    3 }

     

    isEmpty方法,判断KV数是否为0

    1 public boolean isEmpty() {
    2     return size() == 0;
    3 }

     

    get方法

    public Collection<V> get(@Nullable K key) {
        Collection<V> collection = map.get(key);
        // 如果没有Value就新建一个Collection
        if (collection == null) {
          collection = createCollection(key);
        }
        return wrapCollection(key, collection);
    }    

     

    AbstractMultimap.java也实现了一些基本方法,和上一个文件一起涵盖了所有API

    remove方法

    1 public boolean remove(@Nullable Object key, @Nullable Object value) {
    2     // 从Map中按照key找到该集合
    3     Collection<V> collection = asMap().get(key);
    4     // 如果集合不为空,则找到集合中的这个值并删除
    5     return collection != null && collection.remove(value);
    6 }

     

    putAll方法,以key为第一参数,以一个Iterable为第二参数

     1 public boolean putAll(@Nullable K key, Iterable<? extends V> values) {
     2     checkNotNull(values);
     3     // make sure we only call values.iterator() once
     4     // and we only call get(key) if values is nonempty
     5     if (values instanceof Collection) {
     6       Collection<? extends V> valueCollection = (Collection<? extends V>) values;
     7       // 拿出Collection然后把新的addAll进去
     8       return !valueCollection.isEmpty() && get(key).addAll(valueCollection);
     9     } else {
    10       Iterator<? extends V> valueItr = values.iterator();
    11       // 拿出Iterator然后把新的addAll进去
    12       return valueItr.hasNext() && Iterators.addAll(get(key), valueItr);
    13     }
    14 }

     

    putAll方法,以另一个Multimap为参数

    1 public boolean putAll(Multimap<? extends K, ? extends V> multimap) {
    2     boolean changed = false;
    3     for (Map.Entry<? extends K, ? extends V> entry : multimap.entries()) {
    4       changed |= put(entry.getKey(), entry.getValue());
    5     }
    6     return changed;
    7 }

     

    replace方法

    1 public Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
    2     checkNotNull(values);
    3     // 先移除所有
    4     Collection<V> result = removeAll(key);
    5     // 在加入新的值
    6     putAll(key, values);
    7     return result;
    8 }

     

    containsValue方法

    1 public boolean containsValue(@Nullable Object value) {
    2     // 检查每一个Collection是否有这个值
    3     for (Collection<V> collection : asMap().values()) {
    4       if (collection.contains(value)) {
    5         return true;
    6       }
    7     }
    8     return false;
    9 }

     

    containsEntry方法,实际上是用get来判断是否有这个key,然后再看是否有这个值

    public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
        Collection<V> collection = asMap().get(key);
        return collection != null && collection.contains(value);
    }

     

    转载于:https://www.cnblogs.com/lijia0511/p/5708302.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,133
精华内容 2,053
关键字:

multimap