关键字:Java双向Map、DualHashBidiMap
有个需求,需要根据即时修改Map结构中的Value值,比如,将Map中所有value=V1的记录改成value=V2,key保持不变。
数据量比较大,遍历Map性能太差,这就需要根据Value先找到Key,然后去修改。
即:既要根据Key找Value,又要根据Value找Key。
commons-collections中的DualHashBidiMap实现了双向Map的功能,但悲剧的是,Value必须唯一。
自己简单实现了一个双向Map,支持根据Key和Value查找,核心思想是相当于额外保存了一份V->K的映射关系,当根据V查找时候,
先快速找到哪些V存在于哪些K中,然后再根据这些K去找,就很快了。类似于索引表。
代码不够完善,发现Bug还望多多指正。
package com.lxw1234.map import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * * @author lxw的大数据田地 - http://lxw1234.com * @param * @param */ public class MyMap<K,V> { private Map<K,V> kMap = new HashMap<K,V>(); private Map<V,ConcurrentHashMap<K,String>> vMap = new HashMap<V,ConcurrentHashMap<K,String>>(); private final static String VV = "1"; public boolean put(K k,V v) { boolean result = false; if(null == k || null == v) return result; if(kMap.containsKey(k)) { vMap.get(kMap.get(k)).remove(k); //vMap.remove(kMap.get(k)); } kMap.put(k, v); if(vMap.containsKey(v)) { vMap.get(v).put(k,VV); } else { ConcurrentHashMap<K,String> set = new ConcurrentHashMap<K,String>(); set.put(k,VV); vMap.put(v, set); } return true; } public boolean containsKey(K k) { return kMap.containsKey(k); } public boolean containsValue(V v) { return vMap.containsKey(v); } public Set<K> keySet(){ return kMap.keySet(); } public Set<V> valueSet() { return vMap.keySet(); } public V getByKey(K k) { return kMap.get(k); } public ConcurrentHashMap<K,String> getByValue(V v) { return vMap.get(v); } public String toString() { return kMap.toString(); } public static void main(String[] args) { MyMap<String,String> map = new MyMap<String,String>(); map.put("k1", "v1"); map.put("k2", "v2"); map.put("k3", "v1"); map.put("k4", "v2"); System.out.println("k1 -> " + map.getByKey("k1")); System.out.println("v1 -> " + map.getByValue("v1").keySet()); System.out.println("v2 -> " + map.getByValue("v2").keySet()); map.put("k5", "v2"); System.out.println("v2 -> " + map.getByValue("v2").keySet()); map.put("k5", "v1"); System.out.println("v1 -> " + map.getByValue("v1").keySet()); System.out.println("v2 -> " + map.getByValue("v2").keySet()); //替换所有的v1为v111 System.out.println("before update : " + map); for(String k : map.getByValue("v1").keySet()) { map.put(k, "v111"); } System.out.println("after update : " + map); } }
参考更多大数据Hadoop、Spark、Hive相关:lxw的大数据田地
运行结果:
k1 -> v1
v1 -> [k3, k1]
v2 -> [k4, k2]
v2 -> [k5, k4, k2]
v1 -> [k5, k3, k1]
v2 -> [k4, k2]
before update : {k3=v1, k4=v2, k5=v1, k1=v1, k2=v2}
after update : {k3=v111, k4=v2, k5=v111, k1=v111, k2=v2}
相关推荐
在Java编程语言中,Map接口是集合框架的重要组成部分,它提供了键值对(key-value pairs)的存储方式。Map不是列表或数组,而是允许我们通过一个键(key)来查找对应的值(value)。本篇文章将深入讲解Map的使用实例...
以下是一个简单的LRU缓存实现的Java代码框架: ```java class LRUCache, V> { private int capacity; private HashMap, Node> map; private DoublyLinkedList<Node> list; public LRUCache(int capacity) { ...
在Java编程语言中,Map、List和Set是三个核心的集合接口,它们分别代表了键值对、有序元素列表和不重复元素集合。这三种数据结构在实际开发中有着广泛的应用,理解它们的特性和使用方式是每个Java开发者的基础技能。...
在Java编程中,HashMap是一种常用的集合类,它用于存储键值对(KEY-VALUE)的数据结构。HashMap允许我们在常量时间内快速访问数据,基于哈希表的原理实现。当我们需要根据键来查找值时,HashMap提供了高效的方式。...
总结来说,Java集合框架为开发者提供了丰富的数据结构以应对不同场景的需要,从简单的List和Set到复杂的Map结构,再到线程安全的集合实现,每个组件都有其特定的用途和优势。在面试中,理解并能够熟练运用这些集合类...
在操作Map时,常用的方法有put(K key, V value)用于添加键值对,get(K key)用于获取指定键对应的值,containsKey(K key)和containsValue(V value)分别检查键和值是否存在,remove(K key)用于删除键值对,size()返回...
以下是一个简单的LRU缓存实现示例: ```java import java.util.*; class LRUCache, V> { private final int capacity; private final Map, Node, V>> map; private final LinkedList, V>> lruList; public ...
LinkedList则采用双向链表实现,适合于元素的添加和删除,但在随机访问上性能较差。 1.4 Map Map接口不直接继承自Collection,而是提供了一种键值对的映射关系。 1.4.1 概述 Map接口用于存储键值对,其中键是唯一...
List的特点是可以按索引访问元素,支持重复元素,且元素的插入和删除会维护元素顺序。 1.3.2 **常用方法** - `get(int index)`:获取指定索引的元素。 - `set(int index, E element)`:替换指定索引的元素。 -...
`Map`接口是Java集合框架的一部分,它不直接继承自`Collection`接口,因为其元素不是单一的值,而是键值对(key-value pairs)。常见的`Map`实现有`HashMap`、`TreeMap`、`LinkedHashMap`等。每个`Map`实现都有其...
了解和熟练掌握List、Set和Map接口及其实现类,对于编写高效、可维护的Java代码至关重要。在实际应用中,根据需求选择合适的集合类型,并结合排序、遍历、线程安全等知识点,能够更好地解决各种数据结构问题。
Map集合是一个非常重要的部分,它是以键值对(key-value pairs)的形式存储数据的接口。Map接口在java.util包中,并且提供了将键映射到值的对象。这些键不能重复,每个键最多映射到一个值。Map集合不是Collection的...
本示例主要探讨的是Java集合类的简单使用,通过一个名为`CollectionsTest.java`的文件进行演示。这篇博客文章可能详细解释了如何创建、操作和理解Java集合类的基本概念。 首先,Java集合框架主要包括接口和实现这些...
- `Hashtable`:线程安全的`Map`实现,但不支持`null`键或`null`值。 ##### 2.4 Queue `Queue`是一种特殊类型的集合,用于存储元素的先进先出(FIFO)操作。`Queue`非常适合实现队列逻辑,例如任务调度和消息传递...
LinkedList基于双向链表实现,插入和删除操作高效。 1. **Set** - **概述**:Set接口不允许存储重复元素,保证元素的唯一性。 - **常用方法**:add()、remove()、contains()等,与Collection接口类似。 - **实现...
本文将深入探讨Java集合框架,包括Collection、List、Set和Map四大接口,以及它们的实现原理和排序方法。 **1. 集合框架概述** 集合框架是一组接口和类,用于存储、管理和操作对象的容器。这些接口和类为开发者...