三个Demo实例了解Multiset,Multimap,BiMap,它们都是接口,所以在创建对象时不能使用new关键字
Multiset<String> set=HashMultiset.create();
Multimap<String,String> teachers=ArrayListMultimap.create();
BiMap<String,String> bimap=HashBiMap.create();
1.Multiset
统计单词出现的次数这个问题之前在利用HashMap实现分拣存储中出现过,采用分拣存储的办法相比使用List已经使代码变得简洁,但是Guava提供的Multiset接口,可以使解决问题变得更加简单,jdk的Set集合是无序不可重复的,而Multiset是无序可重复的
利用Multiset统计单词出现次数:
主要使用的方法就是 int count(@Nullable Object element),可以对集合中的元素进行计数
import java.util.Set;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
public class Demo05 {
public static void main(String[] args) {
String str = "this is a cat and this is a mice where is the food";
//将句子按照空格划分为单词并存在字符串数组中
String[] strArray = str.split(" ");
//创建一个Multiset对象,注意接口不可new一个对象
Multiset<String> set=HashMultiset.create();
for(String s:strArray){
set.add(s);
}
//获取集合中元素,保存在set中,方便便利
Set<String> letters=set.elementSet();
for(String temp:letters){
System.out.println(temp+" "+set.count(temp));
}
}
}
输出结果为:
mice 1
cat 1
is 3
food 1
a 2
the 1
where 1
this 2
and 1
2.Multimap
Multimap与Map一样,也是有key和value,不同的是Multimap中的key可以重复
利用Multimap分析查看老师的每门课程:
jdk中的map一个键值不可重复,课程对应老师,很多课对应同一个老师,要查看每个老师的课程就不方便,使用MulltiMap,在存放数据的时候把key和value对换,使课程表变成老师表,这里的老师对应的课程都是存放在List集合中
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class Demo06 {
public static void main(String[] args) {
//cours--课程-老师
Map<String,String> cours=new HashMap<String,String>();
cours.put("高等数学", "tom");
cours.put("离散数学", "tom");
cours.put("线性代数", "jack");
cours.put("数学分析", "lucy");
cours.put("概率论", "tom");
//teachers--老师-课程
Multimap<String,String> teachers=ArrayListMultimap.create();
//使用迭代器遍历cours
Iterator<Map.Entry<String,String>> it=cours.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String,String> entry=it.next();
String key=entry.getKey();
String value=entry.getValue();
//教师课程对换
teachers.put(value,key);
}
//查看Multimap
Set<String> keySet=teachers.keySet();
for(String key:keySet){
Collection<String> col=teachers.get(key);
System.out.println(key+" "+col);
}
}
}
输出结果为:
jack [线性代数]
tom [概率论, 离散数学, 高等数学]
lucy [数学分析]
3.BiMap
HashMap 键唯一,值可以重复
BiMap:双向Map(Bidirection Map) 键与值都不能重复(unique value map)
就可以实现通过key得到value,通过value得到key
比如:通过姓名查询邮箱号码,通过邮箱查询姓名
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
public class Demo07 {
public static void main(String[] args) {
BiMap<String,String> bimap=HashBiMap.create();
bimap.put("tom", "28983123@qq.com");
bimap.put("jack", "56483123@qq.com");
bimap.put("lucy", "11113123@qq.com");
//inverse()进行反转
String user=bimap.inverse().get("28983123@qq.com");
System.out.println(user);
System.out.println(bimap.inverse().inverse()==bimap);
}
}
输出结果为:
tom
true