JAVA学习笔记47——其他容器简介4:guava之MulitiSet、MultiMap、BiMap、Table

时间:2021-07-08 16:07:04

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。

接着上一篇的内容来介绍,本篇介绍的是MulitiSet、MultiMap、BiMap、Table这4个guava下面常见的容器以及常用方法,也是通过四段代码来展示:

NO.1:

import java.util.Set;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;

/**
* 统计单词出现的次数
* 1、HashMap 分拣存储+面向对象思维 -->判断
* 2、Multiset :无序+可重复 .count() 增强了可读性 +操作简单
* 实际应用:用来统计、记录例如网站访问的次数
*/
public class Demo05 {
public static void main(String[] args) {
String str ="this is a cat and that is a mice where is the food";
//分割字符串
String[] strArray =str.split(" ");
//存储到Multiset中
Multiset<String> set =HashMultiset.create();
for(String strTemp:strArray){
set.add(strTemp);
}
//获取所有的单词 Set
Set<String> letters =set.elementSet();
for(String temp:letters){
System.out.println(temp+"-->"+set.count(temp));
}
}
}
NO.2:

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;
/**
* 分析查看 教师 教授的每门课程
* 注意:Multimap :key-value key可以重复
*/
public class Demo06 {
public static void main(String[] args) {
Map<String,String> cours =new HashMap<String,String>();
//加入测试数据
cours.put("改革开放", "邓爷爷");
cours.put("三个代表", "*");
cours.put("科学发展观", "*");
cours.put("和谐社会", "*");
cours.put("八荣八耻", "*");
cours.put("....", "习主席");

//Multimap
Multimap<String,String> teachers =ArrayListMultimap.create();

//迭代器
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);
}
}
}
NO.3:

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

/**
* HashMap 键唯一,值可以重复
* BiMap:双向Map(Bidirectional Map ) 键与值都不能重复(unique -valued map)
* (应用例子:根据用户找邮箱等一对一映射状况)
*
*/
public class Demo07 {
public static void main(String[] args) {
BiMap<String,String> bimap=HashBiMap.create();
bimap.put("bjsxt", "bjsxt@sina.com");
bimap.put("good","good@qq.com");
//通过邮箱找用户
String user =bimap.inverse().get("good@qq.com");
System.out.println(user);
System.out.println(bimap.inverse().inverse()==bimap);
}
}
NO.4:

import java.util.Map;
import java.util.Set;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import com.google.common.collect.Tables;

/**
* 双键的Map -->Table -->rowKey+columnKey+value
* 1、方法
* 所有的行数据:cellSet()
* 所有的学生: rowKeySet()
* 所有的课程:columnKeySet()
* 所有的成绩: values()
* 学生对应的课程: rowMap() +get(学生)或者直接row(学生)
* 课程对应的学生: columnMap +get(课程)或者直接column(课程)
*/
public class Demo08 {
public static void main(String[] args) {
Table<String,String,Integer> tables=HashBasedTable.create();
//测试数据
tables.put("a", "javase", 80);
tables.put("b", "javase", 90);
tables.put("a", "oracle", 100);
tables.put("c", "oracle", 95);

//所有的行数据
Set<Cell<String,String,Integer>> cells =tables.cellSet();
for(Cell<String,String,Integer> temp:cells){
System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
}

System.out.println("==========依照学生查看成绩==============");
System.out.print("学生\t");
//所有的课程
Set<String> cours =tables.columnKeySet();
for(String t:cours){
System.out.print(t+"\t");
}
System.out.println();
//所有的学生
Set<String> stus =tables.rowKeySet();
for(String stu:stus){
System.out.print(stu+"\t");
Map<String,Integer> scores =tables.row(stu);
for(String c:cours){
System.out.print(scores.get(c)+"\t");
}
System.out.println();
}

System.out.println("==========依照课程查看成绩==============");
System.out.print("课程\t");
//所有的学生
Set<String> stuSet =tables.rowKeySet();
for(String t:stuSet){
System.out.print(t+"\t");
}
System.out.println();
//所有的课程
Set<String> courSet =tables.columnKeySet();
for(String c:courSet){
System.out.print(c+"\t");
Map<String,Integer> scores =tables.column(c);
for(String s:stuSet){
System.out.print(scores.get(s)+"\t");
}
System.out.println();
}
System.out.println("===========转换===========");
Table<String,String,Integer> tables2 =Tables.transpose(tables);
//所有的行数据
Set<Cell<String,String,Integer>> cells2 =tables2.cellSet();
for(Cell<String,String,Integer> temp:cells2){
System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
}
}
}