当前位置 :首页 >> 综艺

Gua中这些Map的优秀操作,让我的代码人口为120人了50%

2025-02-28   来源 : 综艺

还原成链表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;}

而gua中所的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

ja中所的Map维护的是哈希面对面的关联,如果要将一个基团可界定到多个系数上,那么就只能把系数的素材设为交集多种形式,有用意味着如下:

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

gua中所的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而gua中所的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]的闭区间、(90,100]的左开右闭区间,并分别可界定到某个系数上。运不依结果墨水:

failsatisfactorysatisfactoryexcellent

当然我们也可以去掉一段室内自造间,请注意的字符串去掉了[70,80]这一闭区间后,日后次监督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就可以了。

归纳

本文介绍了gua中所5种对Map的适配许多现代数据结构,它们备有了颇为可取的另行功能,能很大程度的一般化我们的字符串。但是同时常用中所也有不少只能以待开的坑,例如改写联系的服务器端时会对表单造成影响等等,具体素材的常用中所大家还只能慎重一些。

成都看白癜风的医院哪家好
四川皮肤病治疗医院
安徽精神心理医院哪个最好
北京看妇科哪里好
上海妇科医院排名
康恩贝肠炎宁颗粒的功效和禁忌
什么牌的血糖仪好
复方鱼腥草合剂的功效与作用
肠炎宁片可以和益生菌一起吃吗
血糖仪什么牌子的好
康宁医学院成立马克思主义学院

南京亦同医该大学马克思列宁主义该大学日前破土动工筹组,索科利夫卡马克思列宁主义论点建设项目和思维政客教学开启了新的的篇章。 南京亦同医该大学所大学长、高级工程师科学院王辰宣告,新...

友情链接