Discuss / Java / 感觉不太好理解 自己梳理了一下,希望能帮到大家理解

感觉不太好理解 自己梳理了一下,希望能帮到大家理解

Topic source
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;//表示查询的人不在名单内
	}
}

厉害了,你这么一写好理解多了

ddrangers

#3 Created at ... [Delete] [Delete and Lock User]

对 赞!

感谢

写的真好

糯一

#6 Created at ... [Delete] [Delete and Lock User]

哇!谢谢你

可以的

欲小宝

#8 Created at ... [Delete] [Delete and Lock User]

感觉单纯的根据名字查分数的话,觉得map有点多余,想知道map在这里的作用?删除有关map的感觉程序也可以完全执行。

不用判断 if (score!= null),

因为你是根据 findInList(name)方法获取的,

查不到说明没有该学生,或者该学生并没有添加到list中。

与map缓存无关。

DittoKRS

#10 Created at ... [Delete] [Delete and Lock User]

写得很好


  • 1
  • 2

Reply