史上最简单的MultiHashMap的实现(使用JAVA已有的容器框架)
来源:互联网 发布:淘宝好评能不能删除 编辑:程序博客网 时间:2024/05/29 07:57
在开发中,有时候我们需要一对多的容器.J2SE没有提供这样的容器:map,table只支持一对一的映射,惟有list支持存储重复的值,但是不支持映射.
很恼火为什么SUN不开发MultiHashMap,查了一下,SUN给出的官方理由是: MultiHashMap在开发中不经常使用:
The Java Collections Framework doesn't include an interface for multimaps because they aren't used all that commonly.
详情见:http://java.sun.com/docs/books/tutorial/collections/interfaces/map.html
但是SUN给了一个思路:List+Map来实现MultiHashMap.
最开始参考Apache的JAVA开源包commons中的collections包中的MultiHashMap的实现.我在NetBeans中使用了一下这个类,但是很遗憾:编译器提示这个类已经过期,估计是这个类中使用了老版本的JDK中的类.再看代码的实现:实现复杂,把一些父类没有必要的重写的方法也重写了,代码可读性差,尤其是还不支持存储null.实在是很失望,没办法,只有DIY了.写完了后发现:自己比Apache的那些家伙要聪明~_~
1>.支持泛型(不支持泛型,还能称作容器吗?),如果对JAVA的泛型还不熟悉的,请看这篇文章:
http://www.ibm.com/developerworks/cn/java/j-djc02113/index.html个人感觉JAVA的泛型比C++的还要恶心,尤其是类型的限定:居然使用extends.
2>.支持null的存取,这也是符合SUN的JDK规范的,因为HashMap是支持null的存取的.
3>.实现简洁,只重写了必要的父类的方法: put, putAll方法.这样做的原因是:确保存进去的是List或null
简单的说一下实现的思路:HashMap的键值存的是List,这样就实现了一对多.说了这么多,上代码:
package osmanthus.utils;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
* @author FangYuan Gui
* @Copyright GPL
*
*/
public class MultiHashMap<K extends Object, V extends List> extends AbstractMap {
public MultiHashMap() {
iMap = new HashMap<K, V>();
}
@Override
public Set entrySet() {
return iMap.entrySet();
}
@Override
public Object put( Object k, Object v ) {
boolean isList = v instanceof List;
if( isList || ( null == v ) ){
return iMap.put( k, (List) v );
}
return null;
}
public Object put( K k, V v ) {
return iMap.put( k, v );
}
@Override
public void putAll( Map m ) {
if( m instanceof MultiHashMap ){
Iterator itr = m.entrySet().iterator();
Entry entry = null;
while( itr.hasNext() ){
entry = (Entry) itr.next();
put( entry.getKey(), entry.getValue() );
}
}
}
private Map iMap;
}
使用MultiHashMap的代码:
MultiHashMap<String, List > multiMap = new MultiHashMap<String, List >();
ArrayList list = new ArrayList();
list.add( 1 );
list.add( 2 );
list.add( 3 );
list.add( 1 );
list.add( null );
multiMap.put( "1", list );
multiMap.put( "2", list );
multiMap.put( null, null );
System.out.println( "multiMapsize=" + multiMap.size() );
MultiHashMap<String, List > multiMap1 = new MultiHashMap<String, List >();
multiMap1.putAll( multiMap );
System.out.println( "multiMap1size=" + multiMap1.size() );
List llll = (List)multiMap1.get( "1" );
Iterator itr = llll.iterator();
while( itr.hasNext() ){
System.out.println( itr.next() );
}
花最少的时间来解决问题,注重代码的可读性,解决问题越简单越直接越好,不要重复造轮子...
- 史上最简单的MultiHashMap的实现(使用JAVA已有的容器框架)
- Android已有的原生Camera框架中添加自己的API的实现方案。
- 【Android】ADT中使用NDK编译已有的C++实现的库文件
- 使用VS2005的Server Explorer无法连接已有的数据库
- Android使用已有的sqlite数据库的方法
- deque容器的实现框架
- Apache组件commons的MultiHashMap的一对多集合用法
- 已有的项目方案就是最好的
- 一个简单容器的实现
- Vector容器的简单实现
- 使用afinal框架实现简单的下载
- Java实现简单的RPC框架
- java实现简单的RPC框架
- Java实现简单的RPC框架
- Java实现简单的RPC框架
- 实现一个简单的java集合框架
- Java实现简单的RPC框架
- Java实现简单的RPC框架
- 代码阅读器准备
- 我的CSDN博客开张了
- linux2.6字符设备驱动编程第一例:globalmem
- orale 正则 REGEXP_REPLACE
- JPA Security 0.2.0 发布
- 史上最简单的MultiHashMap的实现(使用JAVA已有的容器框架)
- Net 调式案例—实验3 内存(Memory)回顾 System.OutOfMemoryException
- 性能统计中常遇到的网络术语
- Cortex系列ARM内核介绍(转载)
- 在潘多拉星球上建IDC机房哪里最合适?
- 关于trac系统的工作流
- windows网络命令
- ARM介绍
- 八线BGP凭什么卖这么贵?