现在的位置: 首页 > 综合 > 正文

史上最简单的MultiHashMap的实现(使用JAVA已有的容器框架)

2013年06月15日 ⁄ 综合 ⁄ 共 2407字 ⁄ 字号 评论关闭

   在开发中,有时候我们需要一对多的容器.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() );

}

 

花最少的时间来解决问题,注重代码的可读性,解决问题越简单越直接越好,不要重复造轮子...

抱歉!评论已关闭.