Table双键Map
public class OTest {public static void main(String[] args) {Map<String, Map<String, Integer>> map = new HashMap<>();//存放元素Map<String, Integer> workMap = new HashMap<>();workMap.put("Jan", 20);workMap.put("Feb", 28);map.put("Hydra", workMap);Map<String, Integer> workMap2 = new HashMap<>();workMap2.put("Jan", 18);workMap2.put("Feb", 16);map.put("Trunks", workMap2);//取出元素Integer dayCount = map.get("Hydra").get("Jan");System.out.println(dayCount);// 1、定义 一个表格Table<String, String, Integer> table = HashBasedTable.create();//存放元素table.put("Hydra", "Jan", 20);table.put("Hydra", "Feb", 28);table.put("Trunks", "Jan", 28);table.put("Trunks", "Feb", 16);// 1、取出元素Integer dayCount2 = table.get("Hydra", "Jan");System.out.println(dayCount2);// 2、rowKey或columnKey的集合Set<String> rowKeys = table.rowKeySet();System.out.println(rowKeys);Set<String> columnKeys = table.columnKeySet();System.out.println(columnKeys);// 3、value集合Collection<Integer> values = table.values();System.out.println(values);// 4、转为嵌套的MapMap<String, Map<String, Integer>> map2 = table.rowMap();System.out.println(map2);Map<String, Map<String, Integer>> map3 = table.columnMap();System.out.println(map3);}
}
BiMap双向Map
public class OTest2 {public static void main(String[] args) {BiMap<String, String> biMap = HashBiMap.create();biMap.put("Hydra", "Programmer");biMap.put("Tony", "IronMan");biMap.put("Thanos", "Titan");//使用key获取valueSystem.out.println(biMap.get("Tony"));BiMap<String, String> inverse = biMap.inverse();//使用value获取keySystem.out.println(inverse.get("Titan"));// 1、反转后操作的影响上面我们用inverse方法反转了原来BiMap的键值映射,但是这个反转后的BiMap并不是一个新的对象,// 它实现了一种视图的关联,所以对反转后的BiMap执行的所有操作会作用于原先的BiMap上。HashBiMap<String, String> biMap1 = HashBiMap.create();biMap1.put("Hydra", "Programmer");biMap1.put("Tony", "IronMan");biMap1.put("Thanos", "Titan");BiMap<String, String> inverse1 = biMap1.inverse();inverse1.put("IronMan", "Stark");System.out.println(biMap1);// 2、value不可重复// BiMap的底层继承了Map,我们知道在Map中key是不允许重复的,而双向的BiMap中key和value可以认为处于等价地位,因此在这个基础上加了限制,value也是不允许重复的。看一下下面的代码:// 这样代码无法正常结束,会抛出一个IllegalArgumentException异常:try {HashBiMap<String,String> biMap2 = HashBiMap.create();biMap2.put("Tony","IronMan");biMap2.put("Stark","IronMan");} catch (Exception e) {if (e instanceof IllegalArgumentException) {System.out.println("IllegalArgumentException异常");}}// 3、获取value为set集合Set<String> values = biMap.values();System.out.println(values);}
}
Multimap - 多值Map
public class OTest3 {public static void main(String[] args) {Multimap<String, Integer> multimap = ArrayListMultimap.create();multimap.put("day", 1);multimap.put("day", 2);multimap.put("day", 8);multimap.put("month", 3);System.out.println(multimap);// 1、获取值的集合Collection<Integer> day = multimap.get("day");// 如果在创建时指定为ArrayListMultimap类型,那么get方法将返回一个ListArrayListMultimap<String, Integer> multimap2 = ArrayListMultimap.create();List<Integer> day2 = multimap2.get("day");System.out.println(day2);// 同理,你还可以创建HashMultimap、TreeMultimap等类型的Multimap。// Multimap的get方法会返回一个非null的集合,但是这个集合的内容可能是空,看一下下面的例子System.out.println(multimap.get("day"));System.out.println(multimap.get("year"));// 2、操作get后的集合// 和BiMap的使用类似,使用get方法返回的集合也不是一个独立的对象,可以理解为集合视图的关联,对这个新集合的操作仍然会作用于原始的Multimap上,看一下下面的例子:ArrayListMultimap<String, Integer> multimap3 = ArrayListMultimap.create();multimap3.put("day", 1);multimap3.put("day", 2);multimap3.put("day", 8);multimap3.put("month", 3);List<Integer> day3 = multimap3.get("day");List<Integer> month3 = multimap3.get("month");//这个0是下标day3.remove(0);month3.add(12);System.out.println(multimap);// 3、转换为Map// 使用asMap方法,可以将Multimap转换为Map<K,Collection>的形式,同样这个Map也可以看做一个关联的视图,在这个Map上的操作会作用于原始的Multimap。Map<String, Collection<Integer>> map = multimap.asMap();for (String key : map.keySet()) {System.out.println(key + ":" + map.get(key));}map.get("day").add(20);System.out.println(multimap);}
}
RangeMap范围Map
public class OTest4 {public static void main(String[] args) {// 先看一个例子,假设我们要根据分数对考试成绩进行分类,那么代码中就会出现这样丑陋的if-elseSystem.out.println(getRank(80));// 而guava中的RangeMap描述了一种从区间到特定值的映射关系,让我们能够以更为优雅的方法来书写代码。下面用RangeMap改造上面的代码并进行测试:RangeMap<Integer, String> rangeMap = TreeRangeMap.create();rangeMap.put(Range.closedOpen(0, 60), "fail");rangeMap.put(Range.closed(60, 90), "satisfactory");rangeMap.put(Range.openClosed(90, 100), "excellent");System.out.println(rangeMap.get(59));System.out.println(rangeMap.get(60));System.out.println(rangeMap.get(90));System.out.println(rangeMap.get(91));rangeMap.remove(Range.closed(70,80));System.out.println(rangeMap.get(75));}public static String getRank(int score) {if (0 <= score && score < 60) {return "fail";} else if (60 <= score && score <= 90) {return "satisfactory";} else if (90 < score && score <= 100) {return "excellent";}return null;}
}
ClassToInstanceMap实例Map
public class OTest5 {public static void main(String[] args) {ClassToInstanceMap<Object> instanceMap = MutableClassToInstanceMap.create();SysUser user = new SysUser();SysDept dept = new SysDept();instanceMap.putInstance(SysUser.class, user);instanceMap.putInstance(SysDept.class, dept);// 使用ClassToInstanceMap这种方式有什么好处呢?// 首先,这里最明显的就是在取出对象时省去了复杂的强制类型转换,避免了手动进行类型转换的错误。// 其次,我们可以看一下ClassToInstanceMap接口的定义,它是带有泛型的:// public interface ClassToInstanceMap<B> extends Map<Class<? extends B>,B>{...}ClassToInstanceMap<Map> instanceMap2 = MutableClassToInstanceMap.create();HashMap<String, Object> hashMap = new HashMap<>();TreeMap<String, Object> treeMap = new TreeMap<>();ArrayList<Object> list = new ArrayList<>();instanceMap.putInstance(HashMap.class, hashMap);instanceMap.putInstance(TreeMap.class, treeMap);System.out.println(instanceMap2);// 这样是可以正常执行的,因为HashMap和TreeMap都集成了Map父类,但是如果想放入其他类型,就会编译报错:// instanceMap2.putInstance(ArrayList.class, list);}
}