文档章节

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

e
 enxg7456
发布于 2016/10/07 10:58
字数 494
阅读 219
收藏 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
济南
私信 提问
JAVA 中集合ConcurrentMap

ConcurrentMap ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了原有Map的功能 V putIfAbsent(K ke...

osc_ug2wy0bi
01/20
0
0
mybitis 返回Map 而不是List处理

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

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

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

真爱2015
2016/02/26
15
0
java学习--基础知识进阶第七天--HashSet集合、HashMap集合(集合遍历)

今日内容介绍 u HashSet集合 u HashMap集合(集合遍历) 第1章 HashSet集合 1.1 Set接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 ...

osc_5urswk9q
2018/03/24
1
0
Spark算子与RDD基本转换

map 将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。 输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。 flatMap 属于Transformation算子,第一步和m...

osc_bm1l5rx8
2019/03/01
3
0

没有更多内容

加载失败,请刷新页面

加载更多

redis实现tryAcquire

public static boolean tryAcquire(String key) { String value = String.valueOf(System.currentTimeMillis()); String statusCode = redisTemplate.execute(n......

有理想的鸭子
4分钟前
6
0
Cocos Creator 通用框架设计 —— 资源管理

如果你想使用Cocos Creator制作一些规模稍大的游戏,那么资源管理是必须解决的问题,随着游戏的进行,你可能会发现游戏的内存占用只升不降,哪怕你当前只用到了极少的资源,并且有使用cc.lo...

osc_8adtko4d
4分钟前
10
0
谈谈我眼中的CSDN吧

昨天逛博客园看到了这篇曝光率很高的文章:博客搬家——从CSDN到博客园,一篇短短的文章竟然招致这么多人的讨论,可能程序员就喜欢“Java好还是PHP好”这类型的问题吧,好无聊。由于我一直在...

osc_qcm2mqmy
5分钟前
6
0
airtest Firebase打包坑点

使用airtest一段时间了,仅限使用,没有深究,今天想要尝试下air的脚本打包功能,因为是在尝试,所以代码很简单只有一句,启动被测apk 打包方式也很简单,只要自己本地环境搭配好就没问题 因...

osc_vuza8uho
6分钟前
9
0
java修饰符以及面向对象的一些总结

修饰符的作用 修饰符的分类和作用 java当中修饰符根据功能可分为两类,一类是访问全权限修饰符,另一类是非访问权限修饰符。 访问权限修饰符主要有四种:即public、protected、default(不指...

osc_wbienwab
7分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部