文档章节

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

e
 enxg7456
发布于 2016/10/07 10:58
字数 494
阅读 11
收藏 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
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
聊聊redisson的RMap的computeIfAbsent操作

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

go4it
09/25
0
0
Cocos2d-x3.0模版容器详解之二:cocos2d::Map

1.概述 版本: v3.0 beta 语言: C++ 定义在 “COCOS2DXROOT/cocos/base” 路径下的 "CCMap.h" 的头文件中。 ? cocos2d::Map<K,V> 是一个内部使用了 std::unorderedmap的关联容器模版。 std::u...

_子墨
2014/08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部