即时修改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为v111System.out.println("before update : " + map);for (String k : map.getByValue("v1").keySet()) {map.put(k, "v111");}System.out.println("after update : " + map);}
}

转载于:https://www.cnblogs.com/lzjoy/p/4649027.html

【多线程学习第一弹】支持value重复的双向Map相关推荐

  1. 网络爬虫学习第一弹:urllib库使用

    小道之前有学过一点爬虫,但是面对越来越严峻的就业形势,为了提高自身竞争力,决定系统的学习一下爬虫.用的是崔庆才大大的书.写博作为自己的学习笔记,方便以后复习.欢迎高人补充赐教!小道感激不尽! 网络爬虫 ...

  2. 深度进化强化学习第一弹~

    hello,这是鑫鑫鑫的论文分享站,今天分享的文章是Embodied Intelligence via Learning and Evolution ,这是一篇李飞飞等提出深度进化RL,我们一起看看吧 ...

  3. go语言学习第一弹:go和php的区别

    一.前言 go语言也出来有一些年头了,按理说我们身为程序员,是应该身先士卒的去学习它,奈何博主之前总是不敢学,害怕php都掌握的不牢靠,学go语言相当于邯郸学步,最后把php都给忘了(博主刚入行一年的 ...

  4. C#使用EasyHook学习第一弹

    喜欢用C#开发,但API这块是弱项. EasyHook能在C#语言下Hook系统API,值得学习. 今天第一课,照抄官方例子: 1,建立控制台工程 2,工程导入EasyHook(需要装Nuget,过程 ...

  5. 【python牛客刷题】——深度学习第一弹

    !!!个人主页:个人主页 !!!推荐一款模拟面试.刷题神器,从基础到大厂面试题:点击此处进入牛客网注册学习吧 !!!今日的努力,明日的未来 [解析]防止过拟合的几种方法:引入正则化.Dropout.提 ...

  6. Proteus与模电数电学习第一弹

    因为并不是电子信息相关专业的学生,只是学过电工电子课,当时上课的时候没有意识到老师居然拿半个学期的时间讲完了整个模电数电的知识点. 因此上学期学过51和stm32之后就一直对单片机相关的原理一知半解, ...

  7. 爬虫学习-第一弹-批量下载二次元好图

    图片网址:/ | konachan.net - Konachan.com Anime Wallpapers import requests import re import osheaders = { ...

  8. matlab 邻近度 离群点_Matlab基础学习第一弹!干货来啦!

    传说中除了生孩子什么都会的Matlab,客官不考虑学一下嘛!(吐血码字快哭了的必必终于放弃了排版) 做project.参加美赛,写论文必备神器,除了当计算器使用,还可以画图,可以处理数字信号,甚至可以 ...

  9. mysql学习第一弹——查询基础

    目录 一.SQL的分类 二.注释 三.数据的导入 四.基本SELECT语句 五.运算符 算术运算符 比较运算符 逻辑运算符 位运算符 六.排序和分页 排序 分页 七. 多表查询 为什么要多表查询? 多 ...

最新文章

  1. SQL Server 查看对象的权限
  2. Flask项目常见面试问题
  3. properties 特有的方法
  4. Linux中SDIO命令,Linux MMC/SD/SDIO体系结构
  5. 用python写三角形_python写个三角形的问题
  6. 使用AdapterTypeRender对不同类型的item数据到UI的渲染
  7. Struts2 验证码图片实例
  8. 常见软件架构风格介绍
  9. 浏览器阻挡cookies_如何在任何浏览器中阻止Cookies(除了您使用的网站外) | MOS86...
  10. redis设置用户名和密码
  11. 股份制的起源—严谨版与趣味版
  12. 事业单位工资计算机公积金计算,事业单位住房公积金基数怎么算?
  13. excel怎么拆分表格
  14. iOS10访问通讯录、相册等隐私权限设置
  15. KKT条件的物理意义(转)
  16. OpenGL初探:二维卡通人物交互设计
  17. 什么力量推动了互联网的进化
  18. 随机森林(RandomForest,RF)网格搜索法调参
  19. 剑灵狂欢区服务器位置,9377剑灵洪门崛起6月25日部分区合服公告
  20. 政务领域区块链的应用

热门文章

  1. ssm read time out的原因_加盟蜜雪冰城未通过是什么原因?总部公布了两点原因
  2. ThinkPHP6项目基操(8.多应用模式)
  3. PhpSpreadsheet 电子表格(excel) PHP处理笔记
  4. Java笔记-获取自己资源文件中的配置文件(打包成jar包为其他包所引用也能获取)
  5. Java笔记-Servlet相关记录
  6. C++工作笔记-模版类要注意的地方(对比模版函数)
  7. DVWA文件上传high级文件上传漏洞
  8. 创建mysql代码实例_MySQL筹建系列之多实例_mysql
  9. fdfs_client.exceptions.DataError: [-] Error: 2, No such file or directory报错问题
  10. js一次获取整个表单的数据