码迷,mamicode.com
首页 > 其他好文 > 详细

强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等

时间:2019-05-24 00:39:07      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:个数   war   数据   ISE   eve   col   name   class   foreach   

一 Multiset

/**
     * 新类型集合: Multiset: Multiset就是可以保存多个相同的对象,并且无序
     *                      占据了List和Set之间的一个灰色地带
     *           其他实现: TreeMultiset LinkedHashMultiset
     *                  ConcurrentHashMultiset
     *                  ImmutableMultiset
     */
    @Test
    public void newList(){
        HashMultiset<Integer> multiset = HashMultiset.create();
        multiset.add(2,3);//添加指定个数的重复元素
        multiset.count(2); //获取元素在集合中的个数
        multiset.remove(2,2); //移除指定的个数元素
        multiset.setCount(5,2); //和add相同
        multiset.setCount(5,2,3); //修改集合中元素的个数,2个改为3个
        //常见功能,统计每个字符出现的此数
        String strWorld="wer|dffd|ddsa|dfd|dreg|de|dr|ce|ghrt|cf|gt|ser|tg|ghrt|cf|gt|" +
                "ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr|wer|dffd|ddsa|dfd|dreg|de|dr|" +
                "ce|ghrt|cf|gt|ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr";
        HashMultiset<String> multisetStr = HashMultiset.create();
        multisetStr.addAll(Arrays.asList(strWorld.split("\\|")));
        multisetStr.elementSet().forEach(x->System.out.println(x+" :"+multisetStr.count(x)));
    }

 

二 Multimap

    /**
     * Multimap 提供了一个方便地把一个键对应到多个值的数据结构
     *  ”键-单个值映射”的集合(例如:a -> 1 a -> 2 a ->4 b -> 3 c -> 5)
     *  用于替代 Map<K, List<V>>或Map<K, Set<V>>这种结构
     *  提供多种实现 ArrayListMultimap       HashMultimap  等
     */
    @Test
    public void multiMapTest(){
        Multimap<String, User> multimap = ArrayListMultimap.create();
        for (int i = 1; i <= 5; i++) {
            multimap.put("one",User.of().setAge(23).setName("用户"+i).setLevel(i));
        }
        for (int i = 1; i <= 5; i++) {
            multimap.put("two",User.of().setAge(20).setName("用户"+i).setLevel(i));
        }
        multimap.containsKey("one"); //判断是否包含有key
        multimap.size(); //所有元素个数
        //转换为map数据结构
        Map<String, Collection<User>> map = multimap.asMap();
        multimap.remove("key",User.of());//移除key对应下指定的value
        multimap.keys();//获取所有的key
        multimap.values(); //获取所有的value
        multimap.removeAll("one");//移除key对应的所有元素
        multimap.replaceValues("two", Lists.newArrayList(User.of()));// 替换key对应的元素
    }

 

三 BiMap

    /**
     * BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构
     *     能非常方便的实现map<key,value>的转置要求,也就是value变为key,key变为value
     *    保证值是唯一的,因此返回Set而不是普通的Collection
     */
    @Test
    public void biMapTest(){
        BiMap<Integer, String> hashBiMap = HashBiMap.create();
        hashBiMap.put(1,"用户1");
        hashBiMap.put(2,"用户2");
        hashBiMap.put(3,"用户3");
        //键值转换
        BiMap<String, Integer> inverseBiMap = hashBiMap.inverse();
        inverseBiMap.entrySet().forEach(x->
                System.out.println("key:"+x.getKey()+", value:"+x.getValue()));
        //因为值唯一(需要翻转时候key唯一),所以添加时如果value存在抛异常,可使用forcePut强制替换键
        // hashBiMap.put(4,"用户3");  IllegalArgumentException
        hashBiMap.forcePut(4,"用户3"); //强制替换用户3的键为4
        //根据kv进行消费返回结果
        String compute = hashBiMap.compute(4, (x, y) -> x + y);
        System.out.println(compute); // 4用户3
    }

 

四 Table

五 ClassToInstanceMap

六 RangeSet

七 RangeMap

强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等

标签:个数   war   数据   ISE   eve   col   name   class   foreach   

原文地址:https://www.cnblogs.com/houzheng/p/10915314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!