文档章节

简单组合java.util.Map<K,V>实现Map<K,P,V>

e
 enxg7456
发布于 2016/10/07 10:58
字数 494
阅读 12
收藏 0

java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>。

 

接口定义:

Java代码  下载

  1. package cc.lixiaohui.demo.javassist.proxy.util;  
  2.   
  3. import java.util.Collection;  
  4. import java.util.Set;  
  5.   
  6. /** 
  7.  * 两个键的复合map 
  8.  * <pre> 
  9.  * key------+ 
  10.  *          |-->value 
  11.  * param----+ 
  12.  * <pre> 
  13.  *  
  14.  * @author lixiaohui 
  15.  * @date 2016年10月1日 上午10:58:40 
  16.  *  
  17.  */  
  18. public interface CompoundKeyMap<K, P, V> {  
  19.       
  20.     V get(K key, P param);  
  21.     V get(K key, P param, V defValue);  
  22.       
  23.     V put(K key, P param, V value);  
  24.     V putIfAbsent(K key, P param, V value);  
  25.       
  26.     Set<java.util.Map.Entry<CompoundKey<K, P>, V>> entrySet();  
  27.     Set<CompoundKey<K, P>> keys();  
  28.     Collection<V> values();  
  29.       
  30.     int size();  
  31.     boolean isEmpty();  
  32.       
  33.     public interface CompoundKey<K, P> {  
  34.         K getKey();  
  35.         P getParam();  
  36.     }  
  37.       
  38. }  

 

基于HashMap的简单实现,关键在于CompoundKey的hashcode和equals方法的重写:

 

Java代码  下载

  1. package cc.lixiaohui.demo.javassist.proxy.util;  
  2.   
  3. import java.util.Collection;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6. import java.util.Map.Entry;  
  7. import java.util.Objects;  
  8. import java.util.Set;  
  9.   
  10. /** 
  11.  * 基于{@link java.util.HashMap}的CompoundKeyMap的实现. 
  12.  *  
  13.  * @author lixiaohui 
  14.  * @date 2016年10月1日 下午12:37:08 
  15.  *  
  16.  */  
  17. public class CompoundKeyHashMap<K, P, V> implements CompoundKeyMap<K, P, V> {  
  18.   
  19.     private Map<CompoundKey<K, P>, V> map = new HashMap<CompoundKey<K, P>, V>();  
  20.       
  21.       
  22.     public V get(K key, P param) {  
  23.         key = Objects.requireNonNull(key, "key cannot be null");  
  24.         param = Objects.requireNonNull(param, "param cannot be null");  
  25.           
  26.         return map.get(newKey(key, param));  
  27.     }  
  28.   
  29.     private CompoundKeyMap.CompoundKey<K, P> newKey(K key, P param) {  
  30.         return new CompoundKeyImpl<K, P>(key, param);  
  31.     }  
  32.   
  33.     public V get(K key, P param, V defValue) {  
  34.         key = Objects.requireNonNull(key, "key cannot be null");  
  35.         param = Objects.requireNonNull(param, "param cannot be null");  
  36.           
  37.         V value = get(key, param);  
  38.         return value == null ? defValue : value;  
  39.     }  
  40.   
  41.     public V put(K key, P param, V value) {  
  42.         return map.put(newKey(key, param), value);  
  43.     }  
  44.   
  45.     public V putIfAbsent(K key, P param, V value) {  
  46.         return map.putIfAbsent(newKey(key, param), value);  
  47.     }  
  48.   
  49.     public Set<Entry<CompoundKeyMap.CompoundKey<K, P>, V>> entrySet() {  
  50.         return map.entrySet();  
  51.     }  
  52.   
  53.     public Set<CompoundKeyMap.CompoundKey<K, P>> keys() {  
  54.         return map.keySet();  
  55.     }  
  56.   
  57.     public Collection<V> values() {  
  58.         return map.values();  
  59.     }  
  60.   
  61.     public int size() {  
  62.         return map.size();  
  63.     }  
  64.   
  65.     public boolean isEmpty() {  
  66.         return map.isEmpty();  
  67.     }  
  68.   
  69.     static class CompoundKeyImpl<K, P> implements CompoundKey<K, P> {  
  70.   
  71.         private K key;  
  72.           
  73.         private P param;  
  74.           
  75.         CompoundKeyImpl(K key, P param) {  
  76.             super();  
  77.             this.key = key;  
  78.             this.param = param;  
  79.         }  
  80.   
  81.         public K getKey() {  
  82.             return key;  
  83.         }  
  84.   
  85.         public P getParam() {  
  86.             return param;  
  87.         }  
  88.           
  89.         @Override  
  90.         public int hashCode() {  
  91.             final int prime = 31;  
  92.             int result = 1;  
  93.             result = prime * result + ((key == null) ? 0 : key.hashCode());  
  94.             result = prime * result + ((param == null) ? 0 : param.hashCode());  
  95.             return result;  
  96.         }  
  97.   
  98.         @Override  
  99.         public boolean equals(Object obj) {  
  100.             if (this == obj)  
  101.                 return true;  
  102.             if (obj == null)  
  103.                 return false;  
  104.             if (getClass() != obj.getClass())  
  105.                 return false;  
  106.             CompoundKeyImpl<?, ?> other = (CompoundKeyImpl<?, ?>) obj;  
  107.             if (key == null) {  
  108.                 if (other.key != null)  
  109.                     return false;  
  110.             } else if (!key.equals(other.key))  
  111.                 return false;  
  112.             if (param == null) {  
  113.                 if (other.param != null)  
  114.                     return false;  
  115.             } else if (!param.equals(other.param))  
  116.                 return false;  
  117.             return true;  
  118.         }  
  119.     }  
  120.       
  121. }  

 

© 著作权归作者所有

共有 人打赏支持
e
粉丝 0
博文 2
码字总数 4220
作品 0
济南
私信 提问
mybitis 返回Map 而不是List处理

关于使用mybitis返回Map集合 而不是List<Map>集合 在网上也找过一些资料,多是拿 sqlMapClient.queryForMap的例子 说事,要不就是用List<Map>的例子来拿分走人 小白的我想找个完整例子偷懒,...

skyyan2000
2014/04/02
0
2
Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改...

真爱2015
2016/02/26
6
0
聊聊redisson的RMap的computeIfAbsent操作

序 本文主要研究一下redisson的RMap的computeIfAbsent操作 实例 源码分析 ConcurrentMap.computeIfAbsent java/util/concurrent/ConcurrentMap.java computeIfAbsent当该key不存在时,返回的......

go4it
09/25
0
0
DSA数字签名原理及JAVA实现

DSA数字签名是Elgamal和Schnorr数字签名的一个变种,DSA数字签名优于Elgamal数字签名的地方在于它的签名长度较短,并且某些可以破解Elgamal方案的攻击不适用DSA数字签名,DSA数字签名的原理如...

Romane
06/05
0
0
5.Java基础复习----Map

1.Map java.util.Map<K,V> interface 实现Map接口的类用来存储键-值 对; 可以存储null键 Map类中存储的键 -- 值 对通过键来标识,所以键值不能重复 public int size();集合大小 public boo...

baibuxiha
2016/01/24
14
0

没有更多内容

加载失败,请刷新页面

加载更多

Supervisor管理springboot应用

目录 概述 环境准备 spring boot应用 supervisor配置 启动应用 概述 前面博文介绍了Supervisor进程管理,实际应用可以对springboot应用进行管理,如果springboot应用挂掉,Supervisor还可以对它...

java_龙
8分钟前
1
0
将神经网络训练成一个“放大镜”

摘要: 想不想将神经网络训练成一个“放大镜”?我们就训练了一个这样炫酷的神经网络,点击文章一起看下吧! 低分辨率蝴蝶的放大 当我们网购时,我们肯定希望有一个贴近现实的购物体验,也就...

阿里云官方博客
8分钟前
0
0
在细节消息中包含能够捕获失败的信息(63)

程序由于未被捕获异常失败时,系统会自动打印该异常的堆栈轨迹 包含异常的字符串表示法(toString) 通常包含异常的类名,以及紧随其后的细节信息(detail message) 是检查程序失败的必须信...

Java搬砖工程师
9分钟前
0
0
day173-2018-12-10-英语流利阅读-待学习

如何评价特朗普在此次 G20 上的表现? 毛西 2018-12-10 1.今日导读 在公众眼里,特朗普一直是个不省事的主——他爱在推特吐槽,还喜欢到处树敌。但最近,阿根廷首都布宜诺斯艾利斯举行的 G2...

飞鱼说编程
11分钟前
1
0
adr adrl ldr mov简单科普

ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。 编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用...

天王盖地虎626
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部