`
superlxw1234
  • 浏览: 550705 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44349
社区版块
存档分类
最新评论

Java实现的简单双向Map,支持重复Value

    博客分类:
  • java
阅读更多

关键字: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}

 

2
3
分享到:
评论
4 楼 dieslrae 2015-07-15  
不就是给hashmap加了个壳么
3 楼 戢_时光 2015-07-14  
java  不是现有支持可重复的map吗
2 楼 sealave 2015-07-14  
写的挺有想法,其实就是换了一个转变思路!没测试过性能和 其他问题!
1 楼 lhb319lhb 2015-07-14  
不错 

相关推荐

    java中map的使用实例

    在Java编程语言中,Map接口是集合框架的重要组成部分,它提供了键值对(key-value pairs)的存储方式。Map不是列表或数组,而是允许我们通过一个键(key)来查找对应的值(value)。本篇文章将深入讲解Map的使用实例...

    LRU算法 java实现

    以下是一个简单的LRU缓存实现的Java代码框架: ```java class LRUCache, V&gt; { private int capacity; private HashMap, Node&gt; map; private DoublyLinkedList&lt;Node&gt; list; public LRUCache(int capacity) { ...

    java的序列 map list set sequene

    在Java编程语言中,Map、List和Set是三个核心的集合接口,它们分别代表了键值对、有序元素列表和不重复元素集合。这三种数据结构在实际开发中有着广泛的应用,理解它们的特性和使用方式是每个Java开发者的基础技能。...

    HashMap通过VALUE反向求KEY的方法

    在Java编程中,HashMap是一种常用的集合类,它用于存储键值对(KEY-VALUE)的数据结构。HashMap允许我们在常量时间内快速访问数据,基于哈希表的原理实现。当我们需要根据键来查找值时,HashMap提供了高效的方式。...

    Java集合框架常见面试题.pdf

    总结来说,Java集合框架为开发者提供了丰富的数据结构以应对不同场景的需要,从简单的List和Set到复杂的Map结构,再到线程安全的集合实现,每个组件都有其特定的用途和优势。在面试中,理解并能够熟练运用这些集合类...

    重要知识Java中的Set,List,Map的区别.pdf

    在操作Map时,常用的方法有put(K key, V value)用于添加键值对,get(K key)用于获取指定键对应的值,containsKey(K key)和containsValue(V value)分别检查键和值是否存在,remove(K key)用于删除键值对,size()返回...

    LRU页面置换算法(Java)

    以下是一个简单的LRU缓存实现示例: ```java import java.util.*; class LRUCache, V&gt; { private final int capacity; private final Map, Node, V&gt;&gt; map; private final LinkedList, V&gt;&gt; lruList; public ...

    Java集合排序及java集合类详解(Collection、List、Map、Set)借鉴.pdf

    LinkedList则采用双向链表实现,适合于元素的添加和删除,但在随机访问上性能较差。 1.4 Map Map接口不直接继承自Collection,而是提供了一种键值对的映射关系。 1.4.1 概述 Map接口用于存储键值对,其中键是唯一...

    Java集合排序及java集合类详解(Collection、List、Map、Set).pdf

    List的特点是可以按索引访问元素,支持重复元素,且元素的插入和删除会维护元素顺序。 1.3.2 **常用方法** - `get(int index)`:获取指定索引的元素。 - `set(int index, E element)`:替换指定索引的元素。 -...

    map集合以及IO流

    `Map`接口是Java集合框架的一部分,它不直接继承自`Collection`接口,因为其元素不是单一的值,而是键值对(key-value pairs)。常见的`Map`实现有`HashMap`、`TreeMap`、`LinkedHashMap`等。每个`Map`实现都有其...

    Java_Collection_List-Set-Map.zip_list set map

    了解和熟练掌握List、Set和Map接口及其实现类,对于编写高效、可维护的Java代码至关重要。在实际应用中,根据需求选择合适的集合类型,并结合排序、遍历、线程安全等知识点,能够更好地解决各种数据结构问题。

    Map集合的继承关系图.pdf

    Map集合是一个非常重要的部分,它是以键值对(key-value pairs)的形式存储数据的接口。Map接口在java.util包中,并且提供了将键映射到值的对象。这些键不能重复,每个键最多映射到一个值。Map集合不是Collection的...

    Java 集合类 简单Demo

    本示例主要探讨的是Java集合类的简单使用,通过一个名为`CollectionsTest.java`的文件进行演示。这篇博客文章可能详细解释了如何创建、操作和理解Java集合类的基本概念。 首先,Java集合框架主要包括接口和实现这些...

    java 集合类 容器类

    - `Hashtable`:线程安全的`Map`实现,但不支持`null`键或`null`值。 ##### 2.4 Queue `Queue`是一种特殊类型的集合,用于存储元素的先进先出(FIFO)操作。`Queue`非常适合实现队列逻辑,例如任务调度和消息传递...

    Java集合Collection、List、Set、Map使用详解.doc

    LinkedList基于双向链表实现,插入和删除操作高效。 1. **Set** - **概述**:Set接口不允许存储重复元素,保证元素的唯一性。 - **常用方法**:add()、remove()、contains()等,与Collection接口类似。 - **实现...

    Java集合排序及java集合类详解(Collection、List、Map、Set)讲解.pdf

    本文将深入探讨Java集合框架,包括Collection、List、Set和Map四大接口,以及它们的实现原理和排序方法。 **1. 集合框架概述** 集合框架是一组接口和类,用于存储、管理和操作对象的容器。这些接口和类为开发者...

Global site tag (gtag.js) - Google Analytics