所谓BidiMap,直译就是双向Map,可以通过key找到value,也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap当中不光key不能重复,value也不可以。
所谓MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。
所谓LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建,这样的解释初听上去是不是有点不可思议?这样的LazyMap有用吗?我们这样来理解:我们需要一个Map,但是由于创建成员的方法很“重”(比如数据库访问),或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,我们无法在get()之前添加所有可能出现的键/值对,或者任何其它解释得通的原因,我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据生成的话,LazyMap就变得很有用了。
我们还是通过一个具体的例子来说明:
package sean.study.commons.collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.MultiHashMap;
import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.lang.StringUtils;
public class MapUsage {
public static void main(String[] args) {
demoBidiMap();
demoMultiMap();
demoLazyMap();
}
public static void demoBidiMap() {
System.out.println(StringUtils.center(" demoBidiMap ", 40, "="));
BidiMap bidiMap = new DualHashBidiMap();
bidiMap.put("BJ", "Beijing");
bidiMap.put("SH", "Shanghai");
bidiMap.put("GZ", "Guangzhou");
bidiMap.put("CD", "Chengdu");
System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));
System.out.println("Value-Key: Chengdu = " + bidiMap.getKey("Chengdu"));
System.out.println(StringUtils.repeat("=", 40));
}
public static void demoMultiMap() {
System.out.println(StringUtils.center(" demoMultiMap ", 40, "="));
MultiMap multiMap = new MultiHashMap();
multiMap.put("Sean", "C/C++");
multiMap.put("Sean", "OO");
multiMap.put("Sean", "Java");
multiMap.put("Sean", ".NET");
multiMap.remove("Sean", "C/C++");
System.out.println("Sean's skill set: " + multiMap.get("Sean"));
System.out.println(StringUtils.repeat("=", 40));
}
public static void demoLazyMap() {
System.out.println(StringUtils.center(" demoLazyMap ", 40, "="));
// borrowed from Commons Collection's Javadoc
Factory factory = new Factory() {
public Object create() {
return new Date();
}
};
Map lazy = LazyMap.decorate(new HashMap(), factory);
System.out.println(lazy.get("NOW"));
System.out.println(StringUtils.repeat("=", 40));
}
}
以下是运行结果:
============= demoBidiMap ==============
Key-Value: BJ = Beijing
Value-Key: Chengdu = CD
========================================
============= demoMultiMap =============
Sean's skill set: [OO, Java, .NET]
========================================
============= demoLazyMap ==============
Wed Aug 03 12:44:56 CST 2005
========================================
简单说一下这个Factory,它是定义在org.apache.commons.collections包下面的一个接口,用于自定义对象的创建过程。这个有点像是后面我们要讲的Transformer的简化版本,但是也更直接也很好用,至少Commons Collections通过它向开发人员开放了一个可以方便控制对象创建细节的接口。
相关推荐
在C++编程中,`std::multimap`是标准模板库(STL)中的一种关联容器。它是一个可以存储键值对的数据结构,其中键值可以重复。与`std::map`不同,`std::multimap`允许有多个具有相同键的元素。在“好友列表”这个场景中...
在STL容器中,`multimap`是一种关联容器,它允许元素以键值对的形式存储,并且一个键可以对应多个值。与`map`不同的是,`map`保证了键的唯一性,而`multimap`则允许重复的键。 在`multimap`中,每个元素都是一个...
通过multimap进行信息的插入 key(部门编号) value(员工) 分部门显示员工信息 实现步骤: 创建10名员工,放到vector中 遍历vector容器,取出每个员工,进行随机分组 分组后,将员工部门编号作为key,具体员工作为...
多图MultiMAP是一种集成单细胞多组学的方法。 MultiMAP也可以用于批量校正。 更多详细信息可在我们的。安装我们正在努力让包装上pip尽快。 同时享受此占位符解决方案! git clone ...
本程序用c++标准库中的快速排序算法以及容器map和multimap实现了对文件中出现频率靠前的单词进行了统计,至于文件大小取决于你机器所剩的内存数,如果文件数据时海量的(上亿)则本程序可能不适合,需要按照海量数据...
多图这是语言缺少的multimap集合(这也是创建适当的库/包的一种简单做法)。 多重映射(有时也称为多重哈希或多重字典)是映射或关联数组抽象数据类型的概括,其中多个以上值可以与给定键相关联并返回给定键。 此...
### C++ STL 中 `std::multimap` 与 `std::array` 使用详解 #### `std::multimap` 概述 `std::multimap` 是 C++ 标准模板库(STL)中的一个重要关联容器,其特点是可以容纳具有相同键的多个元素。与 `std::map` ...
这个问题可以通过使用C++中的`map`和`multimap`数据结构来解决。 首先,我们需要理解`map`和`multimap`的基本概念。`map`是一个关联容器,它包含唯一键值对,这里的键是单词,值是对应的出现次数。`map`内部默认...
在C++编程中,`Multimap`是一种关联容器,它提供了键值对的无序存储。`Multimap`是标准模板库(STL)的一部分,由`<map>`头文件定义。与`Map`不同,`Multimap`允许键值对的重复,也就是说,同一个键可以映射到多个值...
标题中的“基于multimap映射的动态内存分配算法探究”是指一种新的动态内存管理策略,它利用了C++ STL中的`multimap`容器来优化内存分配的过程。动态内存分配是编程中一个重要的概念,特别是在资源有限的环境中,如...
标题中的“multimap实现tlv”指的是在C++编程中使用`std::multimap`容器来实现一种特定的数据结构——TLV(Tag-Length-Value)。TLV是一种常见于网络协议和数据序列化中的数据表示方式,它将数据分为三个部分:标签...
一、multimap(一对多索引) C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。 完整程序代码: /*请务必运行以下程序后对照阅读*/ ///头文件依旧是map #include #...
multimap.yml
在STL中,`map`和`multimap`就是这样的关联式容器。这两个容器都是基于**红黑树**这种自平衡二叉查找树的数据结构来实现的,保证了在平均情况下,查找、插入和删除操作的时间复杂度为O(log n)。 **map**容器: `map...
在C++标准库中,模板被广泛应用于STL(Standard Template Library,标准模板库),其中包括了各种容器如vector、map、multimap、set和multiset。这些容器都是模板类,它们提供了高效的数据组织和操作方式。 1. **...
c++ vs2019 cpp20规范的STL库的map与multimap源码分析
标题"MXTWebMultipleMaps_carefulkrl_multimap_SharpMapC#_zip_webmap_"揭示了我们将重点讨论的关键技术:C#、SharpMap库以及多图层地图的实现。 SharpMap是一款开源的、基于.NET Framework的GIS库,它允许开发者...
用AVL-tree数据结构作为底层机制,以STL底层空间配置器和iterator_traits编程技法实作出一个独立的关联式容器(map, set, multimap, multiset),并对外提供接口实现和STL完全兼容的容器。