当前位置:首页 >> 娱乐
娱乐

Guava中这些Map的优秀操作,让我的代码其会了50%

2025-09-04 12:19

料混和子程序Map的那种表现形式,可用Table的rowMap或columnMap作法就可以付诸了:

Map rowMap = table.rowMap();Map columnMap = table.columnMap();

查阅转换成格式后的Map中的的具体内容,分别按照行和列顺利进行了核心内容:

{Hydra={Jan=20, Feb=28}, Trunks={Jan=28, Feb=16}}{Jan={Hydra=20, Trunks=28}, Feb={Hydra=28, Trunks=16}}BiMap - 双向Map

在都可Map中的,如果要就让根据value查找完全一致的key,没简单的办法,无论是可用for循环还是算法器,都需加载整个Map。以循环keySet的方式为例:

public List findKey(Map map, String val){ List keys=new ArrayList<>(); for (String key : map.keySet()) { if (map.get(key).equals(val)) keys.add(key); } return keys;}

而guava中的的BiMap提供了一种key和value双向相似性的资料结构,必先看一个比较简单的都是:

HashBiMap biMap = HashBiMap.create();biMap.put("Hydra","Programmer");biMap.put("Tony","IronMan");biMap.put("Thanos","Titan");//可用key提供valueSystem.out.println(biMap.get("Tony"));BiMap inverse = biMap.inverse();//可用value提供keySystem.out.println(inverse.get("Titan"));

继续执行结果,:

IronManThanos

看起来很比较简单是不是?但是可用中的还有几个坑内得避祸一下,比如说一个个推敲。

1、而但会后配置的影响

此前面我们用inverse作法而但会了原来BiMap的数组拓扑,但是这个而但会后的BiMap并不是一个在此之后都可,它付诸了一种贴图的相似性,所以对而但会后的BiMap继续执行的所有配置但会功用于原必先的BiMap上。

HashBiMap biMap = HashBiMap.create();biMap.put("Hydra","Programmer");biMap.put("Tony","IronMan");biMap.put("Thanos","Titan");BiMap inverse = biMap.inverse();inverse.put("IronMan","Stark");System.out.println(biMap);

对而但会后的BiMap中的的具体内容顺利进行了改动后,日后看一下原必先BiMap中的的具体内容:

{Hydra=Programmer, Thanos=Titan, Stark=IronMan}

可以看得见,原必先值为IronMan时完全一致的基团是Tony,虽然没有人直接改动,但是如今基团变成了Stark。

2、value不可重复使用

BiMap的底层继承了Map,我们知道在Map中的key是不无需重复使用的,而双向的BiMap中的key和value可以认为处于等价地位,因此在这个基础上加了限制,value也是不无需重复使用的。看一下比如说的文档:

HashBiMap biMap = HashBiMap.create();biMap.put("Tony","IronMan");biMap.put("Stark","IronMan");

这样文档很难正常结束,但会逃逸一个IllegalArgumentException异常:

如果你非就让把在此之后key拓扑到已有的value上,那么也可以可用forcePut作法强迫附加掉改以的key:

HashBiMap biMap = HashBiMap.create();biMap.put("Tony","IronMan");biMap.forcePut("Stark","IronMan");

由此可知储一下附加后的BiMap:

{Stark=IronMan}

顺带多说一句,由于BiMap的value是不无需重复使用的,因此它的values作法赶回的是没有人重复使用的Set,而不是都可Collection:

Set values = biMap.values();Multimap - 多值Map

java中的的Map维护的是数组各别的彼此间,如果要将一个基团拓扑到多个值上,那么就才会把值的具体内容另设为交集表现形式,比较简单付诸如下:

Map map=new HashMap<>();List list=new ArrayList<>();list.add(1);list.add(2);map.put("day",list);

guava中的的Multimap提供了将一个基团拓扑到多个值的表现形式,可用上来无需概念繁复的内层交集,可以像可用都可的Map一样可用它,概念及填入资料如下:

Multimap multimap = ArrayListMultimap.create();multimap.put("day",1);multimap.put("day",2);multimap.put("day",8);multimap.put("month",3);

由此可知储这个Multimap的具体内容,可以一般化的看得见每个key完全一致的都是一个交集:

{month=[3], day=[1, 2, 8]}1、提供值的交集

在此前面的配置中的,始创的都可Multimap的get(key)作法将赶回一个Collection并不一定的交集:

Collection day = multimap.get("day");

如果在始创时指定为ArrayListMultimap并不一定,那么get作法将赶回一个List:

ArrayListMultimap multimap = ArrayListMultimap.create();List day = multimap.get("day");

所谓,你还可以始创HashMultimap、TreeMultimap等并不一定的Multimap。

Multimap的get作法但会赶回一个非null的交集,但是这个交集的具体内容可能是空,看一下比如说的都是:

List day = multimap.get("day");List year = multimap.get("year");System.out.println(day);System.out.println(year);

由此可知储结果:

[1, 2, 8][]2、配置get后的交集

和BiMap的可用类似,可用get作法赶回的交集也不是一个独立国家的都可,可以了解为交集贴图的相似性,对这个新交集的配置仍然但会功用于更早的Multimap上,看一下比如说的都是:

ArrayListMultimap multimap = ArrayListMultimap.create();multimap.put("day",1);multimap.put("day",2);multimap.put("day",8);multimap.put("month",3);List day = multimap.get("day");List month = multimap.get("month");day.remove(0);//这个0是下标month.add(12);System.out.println(multimap);

查阅改动后的结果:

{month=[3, 12], day=[2, 8]}3、转换成为Map

可用asMap作法,可以将Multimap转换成为Map的表现形式,除此以外这个Map也可以看好好一个相似性的贴图,在这个Map上的配置但会功用于更早的Multimap。

Map map = multimap.asMap();for (String key : map.keySet()) { System.out.println(key+" : "+map.get(key));}map.get("day").add(20);System.out.println(multimap);

继续执行结果:

month : [3]day : [1, 2, 8]{month=[3], day=[1, 2, 8, 20]}4、为数问题

Multimap中的的为数在可用中的也有些非常容易混淆的之外,必先看比如说的都是:

System.out.println(multimap.size());System.out.println(multimap.entries().size());for (Map.Entry entry : multimap.entries()) { System.out.println(entry.getKey()+","+entry.getValue());}

由此可知储结果:

44month,3day,1day,2day,8

这是因为size()作法赶回的是所有key到单个value的拓扑,因此结果为4,entries()作法所谓,赶回的是key和单个value的数组对交集。但是它的keySet中的保由此可知的是多种不同的key的位数,例如比如说这行文档由此可知储的结果就但会是2。

System.out.println(multimap.keySet().size());

日后就让将它转换成为Map后,为数则但会直接影响:

Set> entries = multimap.asMap().entrySet();System.out.println(entries.size());

文档列车运行结果是2,因为它受益的是key到Collection的拓扑彼此间。

RangeMap - 范围Map

必先看一个都是,假另设我们要根据分数对考试成绩顺利进行归纳,那么文档中的就但会消失这样面孔的if-else:

public static String getRank(int score){ if (0<=score && score<60) return "fail"; else if (60<=score && score<=90) return "satisfactory"; else if (90而guava中的的RangeMap描述了一种从区间到特定值的拓扑彼此间,让我们能够以颇为雅致的作法来书写文档。比如说用RangeMap改建工程此前面的文档并顺利进行次测试:

RangeMap 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));

在此前面的文档中的,必先后始创了[0,60)的左闭右边数轴、[60,90]的f、(90,100]的左开右边f,并分别拓扑到某个值上。列车运行结果由此可知储:

failsatisfactorysatisfactoryexcellent

当然我们也可以移除一段空间,比如说的文档移除了[70,80]这一f后,日后次继续执行get时赶回结果为null:

rangeMap.remove(Range.closed(70,80));System.out.println(rangeMap.get(75));ClassToInstanceMap - 实例Map

ClassToInstanceMap是一个比较一般来说的Map,它的基团是Class,而值是这个Class完全一致的实例都可。必先看一个比较简单可用的都是,可用putInstance作法由此可知入都可:

ClassToInstanceMap instanceMap = MutableClassToInstanceMap.create();User user=new User("Hydra",18);Dept dept=new Dept("develop",200);instanceMap.putInstance(User.class,user);instanceMap.putInstance(Dept.class,dept);

可用getInstance作法装进都可:

User user1 = instanceMap.getInstance(User.class);System.out.println(user==user1);

列车运行结果由此可知储了true,说明了装进的或许是我们之此前始创并填入的那个都可。

大家则但会确实,如果只是由此可知都可的话,像比如说这样用都可的Map也可以付诸:

Map map=new HashMap<>();User user=new User("Hydra",18);Dept dept=new Dept("develop",200);map.put(User.class,user);map.put(Dept.class,dept);

那么,可用ClassToInstanceMap这种方式有什么好处呢?

首必先,这里最明显的就是在装进都可时不用了繁复的强迫并不一定转换成,避祸免了手动顺利进行并不一定转换成的偏差。其次,我们可以看一下ClassToInstanceMap接口的概念,它是区别于泛型的:

public interface ClassToInstanceMap extends Map, B>{...}

这个泛型除此以外可以起着对并不一定顺利进行强制执行的功用,value要完全符合key所完全一致的并不一定,日后就让比如说的都是:

ClassToInstanceMap instanceMap = MutableClassToInstanceMap.create();HashMap hashMap = new HashMap<>();TreeMap treeMap = new TreeMap<>();ArrayList list = new ArrayList<>();instanceMap.putInstance(HashMap.class,hashMap);instanceMap.putInstance(TreeMap.class,treeMap);

这样是可以正常继续执行的,因为HashMap和TreeMap都集成了Map父类,但是如果就让填入其他并不一定,就但会编译报错:

所以,如果你就让缓由此可知都可,又不就让好好繁复的并不一定数据流,那么可用方便的ClassToInstanceMap就可以了。

总结

本文介绍了guava中的5种对Map的扩展资料结构,它们提供了非常比较简单的新功能,能很大程度的重构我们的文档。但是同时可用中的也有不少需避祸开的坑内,例如改动相似性的贴图但会对更早资料致使影响等等,具体的可用中的大家还需谨慎一些。

太原性病专科
承德皮肤病专科医院排名
上海医院眼科

上一篇: 民生证券:“双碳”背景下,核电设备迎来千亿市场竞争空间

下一篇: 普莱柯生物工程控股公司有限公司 第四届董事会第十九次会议决议公告

友情链接