Guava类库学习--Multiset+Multimap+BiMap

三个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", "[email protected]");
        bimap.put("jack", "[email protected]");
        bimap.put("lucy", "[email protected]");

        //inverse()进行反转
        String user=bimap.inverse().get("[email protected]");
        System.out.println(user);
        System.out.println(bimap.inverse().inverse()==bimap);
    }
}

输出结果为:

tom
true

你可能感兴趣的:(java,guava,Multimap,bimap,multiset)