强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等
Posted houzheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等相关的知识,希望对你有一定的参考价值。
一 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等的主要内容,如果未能解决你的问题,请参考以下文章
别再造轮子了,Google 开源的 Guava 工具库真心强大!
别再重复造轮子了,推荐使用 Google Guava 开源工具类库,真心强大!