-
Guava进修笔记:Guava新增凑集类型-Multiset
添加时间:2013-7-8 点击量:Guava引进了JDK里没有的,然则很是有效的一些新的凑集类型。所有这些新凑集类型都能和JDK里的凑集腻滑集成。Guava凑集很是精准地实现了JDK定义的接口。Guava中定义的新凑集有:
Multiset
SortedMultiset
Multimap
ListMultimap
SetMultimap
BiMap
ClassToInstanceMap
TableMultiset凑集
Multiset是什么?顾名思义,Multiset和Set的差别就是可以保存多个雷同的对象。在JDK中,List和Set有一个根蒂根基的差别,就是List可以包含多个雷同对象,且是有次序的,而Set不克不及有反复,且不包管次序(有些实现有次序,例如LinkedHashSet和SortedSet等)所以Multiset占领了List和Set之间的一个灰色地带:容许反复,然则不包管次序。
常见应用处景:Multiset有一个有效的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。 常见的通俗实现体式格式如下:@Test
public void testWordCount(){
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;
String[] words=strWorld.split(\\|);
Map<String, Integer> countMap = new HashMap<String, Integer>();
for (String word : words) {
Integer count = countMap.get(word);
if (count == null) {
countMap.put(word, 1);
}
else {
countMap.put(word, count + 1);
}
}
System.out.println(countMap:);
for(String key:countMap.keySet()){
System.out.println(key+ count:+countMap.get(key));
}
}上方的代码实现的功能很是简单,用于记录字符串在数组中呈现的次数。这种场景在实际的开辟过程还是轻易经常呈现的,若是应用实现Multiset接口的具体类就可以很轻易实现以上的功能需求:
public void testMultsetWordCount(){
String strWorld=wer|dfd|dd|dfd|dda|de|dr;
String[] words=strWorld.split(\\|);
List<String> wordList=new ArrayList<String>();
for (String word : words) {
wordList.add(word);
}
Multiset<String> wordsMultiset = HashMultiset.create();
wordsMultiset.addAll(wordList);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
}Multiset首要办法
Multiset接口定义的接口首要有:
add(E element) :向此中添加单个元素
add(E element,int occurrences) : 向此中添加指定个数的元素
count(Object element) : 返回给定参数元素的个数
remove(E element) : 移除一个元素,其count值 会响应削减
remove(E element,int occurrences): 移除响应个数的元素
elementSet() : 将不合的元素放入一个Set中
entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支撑应用getElement()和getCount()
setCount(E element ,int count): 设定某一个元素的反复次数
setCount(E element,int oldCount,int newCount): 将合适原有反复个数的元素批改为新的反复次数
retainAll(Collection c) : 保存呈如今给定凑集参数的所有的元素
removeAll(Collectionc) : 去除呈现给给定凑集参数的所有的元素常用办法实例:
@Test
public void testMultsetWordCount(){
String strWorld=wer|dfd|dd|dfd|dda|de|dr;
String[] words=strWorld.split(\\|);
List<String> wordList=new ArrayList<String>();
for (String word : words) {
wordList.add(word);
}
Multiset<String> wordsMultiset = HashMultiset.create();
wordsMultiset.addAll(wordList);
//System.out.println(wordsMultiset:+wordsMultiset);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
if(!wordsMultiset.contains(peida)){
wordsMultiset.add(peida, 2);
}
System.out.println(============================================);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
if(wordsMultiset.contains(peida)){
wordsMultiset.setCount(peida, 23);
}
System.out.println(============================================);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
if(wordsMultiset.contains(peida)){
wordsMultiset.setCount(peida, 23,45);
}
System.out.println(============================================);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
if(wordsMultiset.contains(peida)){
wordsMultiset.setCount(peida, 44,67);
}
System.out.println(============================================);
for(String key:wordsMultiset.elementSet()){
System.out.println(key+ count:+wordsMultiset.count(key));
}
}输出:
de count:1
dda count:1
dd count:1
dfd count:2
wer count:1
dr count:1
============================================
de count:1
dda count:1
dd count:1
dfd count:2
peida count:2
wer count:1
dr count:1
============================================
de count:1
dda count:1
dd count:1
dfd count:2
peida count:23
wer count:1
dr count:1
============================================
de count:1
dda count:1
dd count:1
dfd count:2
peida count:45
wer count:1
dr count:1
============================================
de count:1
dda count:1
dd count:1
dfd count:2
peida count:45
wer count:1
dr count:1申明:setCount(E element,int oldCount,int newCount): 办法,若是传入的oldCount和element的不一致的时辰,是不克不及讲element的count设置成newCount的。须要重视。
Multiset不是Map
须要重视的是Multiset不是一个Map<E,Integer>,尽管Multiset供给一项目组类似的功能实现。其它值得存眷的差别有:
Multiset中的元素的反复个数只会是正数,且最大不会跨越Integer.MAX_VALUE。设定计数为0的元素将不会呈现multiset中,也不会呈现elementSet()和entrySet()的返回成果中。
multiset.size() 办法返回的是所有的元素的总和,相当于是将所有反复的个数相加。若是须要知道每个元素的个数可以应用elementSet().size()获得.(因而调用add(E)办是multiset.size()增长1).
multiset.iterator() 会轮回迭代每一个呈现的元素,迭代的次数与multiset.size()雷同。 iterates over each occurrence of each element, so the length of the iteration is equal to multiset.size().
Multiset 支撑添加、移除多个元素以及从头设定元素的个数。履行setCount(element,0)相当于移除multiset中所有的雷同元素。
调用multiset.count(elem)办法时,若是该元素不在该集中,那么返回的成果只会是0。Multiset的实现
Guava供给了Multiset的多种实现,这些实现根蒂根基对应了JDK中Map的实现:
Map Corresponding Multiset Supports null elements
HashMap HashMultiset Yes
TreeMap TreeMultiset Yes (if the comparator does)
LinkedHashMap LinkedHashMultiset Yes
ConcurrentHashMap ConcurrentHashMultiset No
ImmutableMap ImmutableMultiset No
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》