【锁学习第一弹】支持value重复的双向Map

即时修改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去找,就很快了。类似于索引表。

package collectionUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

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 (k == null || v == null) {
			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);

	}
}
时间: 2024-11-08 21:44:44

【锁学习第一弹】支持value重复的双向Map的相关文章

FluentData 学习 第一弹

地址: http://fluentdata.codeplex.com/ 前世: FluentData 我们公司用的一个增删改查的里面的持久层.之前还不知道 这个持久层叫FluentData.  某天看见群里 说 某视频网站里面 居然在讲这个开发框架,还收费.我搜了一下.fluentdata有源代码. 这个13年有过记载.不过我是新手.什么也需要 学习一下.  和 室友说了一下微型orm ,他们 呢  用的  微型orm是 Dapper .可以去了解一下. 废话真多,完毕. FluentData

Python学习第一弹——Python环境搭建

一.Python简介: Python,是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起.常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用

python学习第一弹:爬虫(抓取博客园新闻)

前言 说到python,对它有点耳闻的人,第一反应可能都是爬虫~ 这两天看了点python的皮毛知识,忍不住想写一个简单的爬虫练练手,JUST DO IT 准备工作 要制作数据抓取的爬虫,对请求的源页面结构需要有特定分析,只有分析正确了,才能更好更快的爬到我们想要的内容. 打开博客园任何一个新闻页面,比如https://news.cnblogs.com/n/570973/,思路是通过这个源页面,并且根据页面中的“上一篇”.“下一篇”等链接,源源不断的爬取其它新闻内容. 浏览器访问https://

Python 学习第一弹:基本数据类型

python提供了很多数据结构,不过其很多操作都是朴素操作,速度慢时间复杂度参见:https://wiki.python.org/moin/TimeComplexity 可遍历(for): list, string, 判断元素是否存在(in): list, string, tuple 合并: list, string 元素个数(len()) 元素和(sum()) string(字符串) word = 'banana' 特点: 不可变的列表 list(列表) a = [1, 'abc', [a,

C#学习第一弹之Hello World

这学期开始了C#的学习,俗话说的好,“万事”从Hello World开始,先贴上自己的Hello World代码. 1 class HelloWorld 2 { 3 static void Main( string[] args ) 4 { 5 System.Console.WriteLine("Hello World"); 6 } 7 } 以上便是一个最基本的Hello World程序,它代表了一个C#程序的基本框架.任何一个C#程序都必须至少含有一个类,且程序从Main函数开始执行

Java高精度学习第一弹

为了快速解决高精度问题,总算是要来接触java了,算上这学期要开java的课了,好好学习吧! 拿来练手的是hdu的1002,高精度加法. 1 import java.util.*; 2 import java.math.*; 3 import java.io.*; 4 5 public class Main { 6 public static void main(String []args) { 7 8 Scanner in = new Scanner(System.in); 9 int n =

css学习の第一弹—格式创建

构成结构:选择符(又称为选择qi器){声明(属性:值):}*****注意:大括号,冒号,每个声明后的分号. 注释:/*注释内容写在这里*/ 一.css样式 css样式写的地方的不同分类:内联式.嵌入式.外部式 内联式:<p style="color:red">这里文字是红色.</p> 注意要写在元素的开始标签里,不能写在截至标签中*****注意:=""双引号的存在,引号中的冒号存在. 嵌入式:<style type = "te

jsp学习第一弹

早期动态网站开发技术主要使用cgi技术,cgi的基本原理是,将浏览器提交至web服务器的数据通过环境变量传递给其他外部程序,经外部程序处理后,再由cgi把处理结果传送给web服务器,最后由web服务器把结果返回浏览器. JSP特点: 1.一次编写,随处运行. 2.可重用组件技术. 3.标记化页面开发. 4.对大型web应用支持良好. <%@%>JSP指令:设定页面级的指令星系,引用其他的外部文件或者定制标记库.会随着JSP页面编译成Servlet,然后由JSP引擎负责处理.

Python基础学习——第一弹

高级语言-------->字节码---------->机器码 低级语言-------->机器码 性能:高级<低级 高级语言的自动垃圾处理机制,方便,开发效率高. php类:快速搭建网站,适用于写网页,有局限性. python/C/java:人工智能. python/java:既能写页面,又能写后台功能. Java执行效率高于python,Java能做的事,python都能做,并且开发效率更高. 数据库才是程序执行速度的元凶. python种类: Jpython IronPython