Muiltset和MultiMap学习--如何让map存放相同的key

在sun的api中,map是不支持直接存放相同的key的,相同key会被后一个key替代的,但是我们可以通过一些工具包实现这样的功能,
google基于java1.6的类库集合的扩展项目–guava,其中com.google.common.collect包就支持这样的操作.下面就直接看代码:

public class NewSetTest {

    /**
     * ArrayuListMultiMap的使用,
     * 相当于map的 <key,List> 形式,返回List视图
     */
    @Test
    public void test1(){
        ArrayListMultimap<Integer,Object> amap = ArrayListMultimap.create();
        amap.put(1, "hello");
        amap.put(1, "guava");
        amap.put(2, "stydy");
//      System.out.println(amap);//{1=[hello, guava], 2=[stydy]}

        //get(key) 得到 collection 对象
        List<Object> list = amap.get(1);
        System.out.println(list);//[hello, guava]
    }

    /**
     * HashMultimap 实现往map中添加重复的key,这个是与set是不同的
     */
    @Test
    public void test2(){
        HashMultimap<Integer,Object> hmap = HashMultimap.create();
        hmap.put(1, "hello");
        hmap.put(1, "guava"); //可以添加重复的key,不会被替换
        hmap.put(2, "stydy");

        //由get(key) 得到Set视图
        Set<Object> set = hmap.get(1);

        //entries方式遍历,遍历了3次
        for(Entry<Integer, Object> entry:hmap.entries()){
            Integer key = entry.getKey();
            Object value = entry.getValue();
//          System.out.print(key+":"+value+" ");//1:hello 1:guava 2:stydy 
        }

        //转成asMap后进行遍历,遍历了两次
        Map<Integer, Collection<Object>> asMap = hmap.asMap();
        for (Entry<Integer,Collection<Object>> entry : asMap.entrySet()) {
            Integer key = entry.getKey();
            Object value = entry.getValue();
            System.out.print(key+":"+value+" ");//1:[hello, guava] 2:[stydy] 
        }

    }

    /**
     * Multiset 实现往set中添加重复的元素
     */
    @Test
    public void test3(){
        Set<Integer>set = new HashSet<>();
        set.add(3);
        set.add(2);
        set.add(2);
        set.add(4);
//      System.out.println(set);//[2, 3, 4]

        Multiset<Integer>mset = HashMultiset.create();
        mset.add(3);
        mset.add(2);
        mset.add(2);
        mset.add(4);
//      System.out.println(mset);//[2 x 2, 3, 4]

        //**----Multiset看做map时候的功能-----*//

        //elementSet 返回不重复的元素
        Set<Integer> elementSet = mset.elementSet();
//      System.out.println(elementSet);//[2, 3, 4]

        //entrySet 返回重复的元素
        Set<com.google.common.collect.Multiset.Entry<Integer>> entrySet = mset.entrySet();
        System.out.println(entrySet);//[2 x 2, 3, 4]

    }

    /**
     * Multiset实现统计某个元素的个数
     */
    @Test
    public void test4(){
        List<Integer>list = new ArrayList<>();
        list.add(3);
        list.add(2);
        list.add(2);
        list.add(4);

        //Multiset的addAll方法以及统计指定元素的个数的方法 
        Multiset<Integer>mset = HashMultiset.create();
        mset.addAll(list);
//      System.out.println(mset);//[2 x 2, 3, 4]

        //统计某个元素的个数
        int count = mset.count(2);
//      System.out.println("2的个数为  = "+count);//2的个数为  = 2

        //直接设置某个元素的个数
        mset.setCount(2, 1);
        System.out.println("mset = "+mset);//mset = [2, 3, 4]


    }

    /**
     * BiMap的使用: 
     *  BiMap可以使得map的value为唯一,并且可以通过value得到key
     */

    @Test
    public void test5(){
        BiMap<String,Integer>bmap = HashBiMap.create();
        bmap.put("zhangsan", 3);
        bmap.put("li", 4);
        bmap.put("wang", 2);
//      System.out.println(bmap);//{wang=2, zhangsan=3, li=4}

        //通过value的到key
        String key = bmap.inverse().get(4);
//      System.out.println(key);//li

    }













}
`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值