class Students { List<Student> list;//定义了一个Student的List,名为list,可能十分巨大 Map<String, Integer> cache;//定义了一个Map,key为String类型,value为Integer类型 //作为缓存来存放那些被查询频率很高的学生,比如成绩差爱惹事的学生,下次查询直接从这里面找就会很快 Students(List<Student> list) { this.list = list; cache = new HashMap<>(); } int getScore(String name) { // a.有个娃犯事了,先看看重点关注对象(cache)里有没有这娃 Integer score = this.cache.get(name);//试图从cache中查找这娃对应的成绩 if (score == null) {//b.如果成绩为null,说明没有重点关注他(cache里没有他的名字) // TODO: score = findInList(name);//c.我们再在学校的超级学生名册里来查找一下 if (score!= null) {//d.如果有成绩记录,score不为null,看来确实是我们学校的学生 cache.put(name, score);//e.立即把他放到重点关注对象里来,下次犯事了很快就能查到他所有信息 } } return score == null ? -1 : score.intValue();//f.这里不太好理解,为什么会再次判断score是否为null,我们来分析一下: //这里有两种情况: //1.当在执行步骤b的判断时如果score!=null,说明重点关注对象里有他,直接跳过if循环,return时score==null为假,返回他的成绩 //2.当在执行步骤b的判断时如果score==null,if循环里的程序会被执行,这里步骤c的语句 score = findInList(name)会重新对score进行赋值 //根据下面findInList(String name)方法我们知道它可能返回null,也可能返回分数,所以最后return的时候会再次判断score是否为null //如果score为null则返回-1,表示这个学生不在超级学生名单里,不是学校里的娃 } Integer findInList(String name) { for (var ss : this.list) { if (ss.name.equals(name)) { return ss.score; } } return null;//表示查询的人不在名单内 } }
厉害了,你这么一写好理解多了
对 赞!
感谢
写的真好
哇!谢谢你
可以的
感觉单纯的根据名字查分数的话,觉得map有点多余,想知道map在这里的作用?删除有关map的感觉程序也可以完全执行。
不用判断 if (score!= null),
因为你是根据 findInList(name)方法获取的,
查不到说明没有该学生,或者该学生并没有添加到list中。
与map缓存无关。
写得很好
Sign in to make a reply
_我是来微博看美女的