`

Multimap

    博客分类:
  • java
 
阅读更多
Multimap是guava中一个有用的工具类,下面我来介绍一下。

由来:
你是不是经常需要一个这样的数据结构:
Java代码  收藏代码

    Map<String,List<MyClass>> myClassListMap test2 
                                  = new HashMap<String,List<MyClass>>() 


自己实现太麻烦,你需要检查key是否存在,否则创建一个,最后代码成为这个样子:
Java代码  收藏代码

    void putMyObject(String key, Object value) { 
        List<Object> myClassList = myClassListMap.get(key); 
        if(myClassList == null) { 
            myClassList = new ArrayList<object>(); 
            myClassListMap.put(key,myClassList); 
        } 
        myClassList.add(value); 
    } 



比较痛苦,如果你希望检查List中的对象是否存在,删除一个对象,或者遍历整个数据结构,那么需要更多的代码。

guava来了:
Java代码  收藏代码

    Multimap<String,Object> myMultimap = ArrayListMultimap.create(); 



这里需要注意,所有的guava的集合都有create()方法,这个好处就是比较简单,你不用重复泛型信息了。

好了,开始使用Multimap了:
Java代码  收藏代码

    public class MutliMapTest { 
        public static void main(String... args) { 
      Multimap<String, String> myMultimap = ArrayListMultimap.create(); 
       
      // Adding some key/value 
      myMultimap.put("Fruits", "Bannana"); 
      myMultimap.put("Fruits", "Apple"); 
      myMultimap.put("Fruits", "Pear"); 
      myMultimap.put("Vegetables", "Carrot"); 
       
      // Getting the size 
      int size = myMultimap.size(); 
      System.out.println(size);  // 4 
       
      // Getting values 
      Collection<string> fruits = myMultimap.get("Fruits"); 
      System.out.println(fruits); // [Bannana, Apple, Pear] 
       
      Collection<string> vegetables = myMultimap.get("Vegetables"); 
      System.out.println(vegetables); // [Carrot] 
       
      // Iterating over entire Mutlimap 
      for(String value : myMultimap.values()) { 
       System.out.println(value); 
      } 
       
      // Removing a single value 
      myMultimap.remove("Fruits","Pear"); 
      System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear] 
       
      // Remove all values for a key 
      myMultimap.removeAll("Fruits"); 
      System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!) 
    } 
    } 


这里有一点你可能会疑惑,就是为何get方法返回的是一个collection而不是list,这是因为前者会更加有用。如果你需要基于multimap直接操作list或者set,那么可以使用在定义类型的时候使用子类名称:ListMultimap,SetMultimap和SortedSetMultimap。例如:
Java代码  收藏代码

    ListMutlimap<String,String> myMutlimap = ArrayListMultimap.create(); 
     
    List<string> myValues = myMutlimap.get("myKey");  // Returns a List, not a Collection. 

分享到:
评论

相关推荐

    好友列表(multimap实现)

    在C++编程中,`std::multimap`是标准模板库(STL)中的一种关联容器。它是一个可以存储键值对的数据结构,其中键值可以重复。与`std::map`不同,`std::multimap`允许有多个具有相同键的元素。在“好友列表”这个场景中...

    STL容器multimap的使用

    在STL容器中,`multimap`是一种关联容器,它允许元素以键值对的形式存储,并且一个键可以对应多个值。与`map`不同的是,`map`保证了键的唯一性,而`multimap`则允许重复的键。 在`multimap`中,每个元素都是一个...

    C++ STL(vector+multimap容器)案例

    通过multimap进行信息的插入 key(部门编号) value(员工) 分部门显示员工信息 实现步骤: 创建10名员工,放到vector中 遍历vector容器,取出每个员工,进行随机分组 分组后,将员工部门编号作为key,具体员工作为...

    利用快速排序及multimap统计文件频率靠前的单词

    本程序用c++标准库中的快速排序算法以及容器map和multimap实现了对文件中出现频率靠前的单词进行了统计,至于文件大小取决于你机器所剩的内存数,如果文件数据时海量的(上亿)则本程序可能不适合,需要按照海量数据...

    C++multimap介绍及详细使用示例(源代码)

    ### C++ STL 中 `std::multimap` 与 `std::array` 使用详解 #### `std::multimap` 概述 `std::multimap` 是 C++ 标准模板库(STL)中的一个重要关联容器,其特点是可以容纳具有相同键的多个元素。与 `std::map` ...

    前K个高频单词(map+multimap)1

    这个问题可以通过使用C++中的`map`和`multimap`数据结构来解决。 首先,我们需要理解`map`和`multimap`的基本概念。`map`是一个关联容器,它包含唯一键值对,这里的键是单词,值是对应的出现次数。`map`内部默认...

    基于multimap映射的动态内存分配算法探究1

    标题中的“基于multimap映射的动态内存分配算法探究”是指一种新的动态内存管理策略,它利用了C++ STL中的`multimap`容器来优化内存分配的过程。动态内存分配是编程中一个重要的概念,特别是在资源有限的环境中,如...

    MultiMAP:用于单细胞多组学集成的MultiMAP

    多图MultiMAP是一种集成单细胞多组学的方法。 MultiMAP也可以用于批量校正。 更多详细信息可在我们的。安装我们正在努力让包装上pip尽快。 同时享受此占位符解决方案! git clone ...

    go-multimap:Go-Multimap是Go中`multimap`数据结构的实现

    多图这是语言缺少的multimap集合(这也是创建适当的库/包的一种简单做法)。 多重映射(有时也称为多重哈希或多重字典)是映射或关联数组抽象数据类型的概括,其中多个以上值可以与给定键相关联并返回给定键。 此...

    map/multimap属于**关联式容器**,底层结构是用二叉树实现

    在STL中,`map`和`multimap`就是这样的关联式容器。这两个容器都是基于**红黑树**这种自平衡二叉查找树的数据结构来实现的,保证了在平均情况下,查找、插入和删除操作的时间复杂度为O(log n)。 **map**容器: `map...

    MXTWebMultipleMaps_carefulkrl_multimap_SharpMapC#_zip_webmap_

    标题"MXTWebMultipleMaps_carefulkrl_multimap_SharpMapC#_zip_webmap_"揭示了我们将重点讨论的关键技术:C#、SharpMap库以及多图层地图的实现。 SharpMap是一款开源的、基于.NET Framework的GIS库,它允许开发者...

    C++模板(vector、map、multimap、set、multiset)

    在C++标准库中,模板被广泛应用于STL(Standard Template Library,标准模板库),其中包括了各种容器如vector、map、multimap、set和multiset。这些容器都是模板类,它们提供了高效的数据组织和操作方式。 1. **...

    cpp代码-Multimap 案例

    在C++编程中,`Multimap`是一种关联容器,它提供了键值对的无序存储。`Multimap`是标准模板库(STL)的一部分,由`&lt;map&gt;`头文件定义。与`Map`不同,`Multimap`允许键值对的重复,也就是说,同一个键可以映射到多个值...

    multimap实现tlv

    标题中的“multimap实现tlv”指的是在C++编程中使用`std::multimap`容器来实现一种特定的数据结构——TLV(Tag-Length-Value)。TLV是一种常见于网络协议和数据序列化中的数据表示方式,它将数据分为三个部分:标签...

    C++ STL入门教程(7) multimap、multiset的使用

    一、multimap(一对多索引) C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。 完整程序代码: /*请务必运行以下程序后对照阅读*/ ///头文件依旧是map #include #...

    c++ vs2019 cpp20规范的STL库的map与multimap源码分析

    c++ vs2019 cpp20规范的STL库的map与multimap源码分析

    AVL_Tree实现STL中的map, set, multimap和multiset

    用AVL-tree数据结构作为底层机制,以STL底层空间配置器和iterator_traits编程技法实作出一个独立的关联式容器(map, set, multimap, multiset),并对外提供接口实现和STL完全兼容的容器。

    multimap.yml

    multimap.yml

    com.google.common.collect

    它们提供了一些标准集合类不具备的功能,例如`Multiset`允许元素有多个计数值,`Multimap`则可以将一个键关联到多个值。 总的来说,Guava的`com.google.common.collect`包为Java开发者提供了一套强大的工具,能够...

Global site tag (gtag.js) - Google Analytics