一点心得
- 我发现我很享受这个不看视频,自我探索式的还原老师的代码的过程。
- 这一次我对“以终为始,逐级分解”这个思维模型进行了刻意练习。
第121集:HashMap、经典存储、经典分拣思路、与面向对象组合解题
思维模型:以终为始,逐级分解
条件
一堆学生,有不同的班级,分数,不同的班级有班号
结果
统计出每个班级的总分和平均分
分解
- 问:为获得预期结果,目前可知道有哪些内容需要代码表示?
答:班级、学生、个人分数、班级总分、平均分、班号、班级的学生人数、 - 问:这些内容如何形成用Java的对象装起来。
答:
- 对象
- 班级
- 属性
- 装学生的容器(这里可得学生人数,进而算出平均分)
- 班号
- 总分
- 方法
- 将学生添加进对应班级的方法——>根据学生的班号,将班级与学生对应起来——>根据学生的班号,创建对应班级,再将班级与学生对应起来——>根据学生的班号,创建对应班级,再将学生添加进新建出来的班级中——>
- 计算平均分的方法
- 打印平均分的方法
- set/get方法
- 带参与不带参构造函数
- 学生
- 属性
- 所属班级班号
- 个人分数
- 方法
- set/get方法
- 带参与不带参构造函数
- 问:接下来呢?
答:想不明白时写代码,寻求进行下一步的思路
package test121;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ClassRoom {
private String no;
private int totalScore;
private List<Student> list;
public ClassRoom(){
list = new ArrayList<Student>();
}
public ClassRoom(String no){
this.no = no;
}
public void setNo(String no){
this.no = no;
}
public String getNo(){
return no;
}
public int getTotalScore() {
return totalScore;
}
public void setTotalScore(int totalScore) {
this.totalScore = totalScore;
}
public void setList(List<Student> list){
this.list = list;
}
public List<Student> getList(){
return list;
}
//******
public static void main(String[] args){
List<Student> testList = new ArrayList<Student>();
exam(testList);
//将学生添加进对应班级的方法
//根据学生的班号,创建对应班级,再将学生添加进新建出来的班级中
Map<String,ClassRoom> rooms = new HashMap<String,ClassRoom>();
//把班号与班级形成键值对,通过键能找到班级,也能通过键找到学生
statistics(testList,rooms);
//至此已将总分算出来了,数据存在room的totalScore属性里
//将每个班级的这个属性取出来打印。
//遍历rooms
printScore(rooms);//打印Map容器中的班级分数情况
}
//创建学生的数据
public static void exam(List<Student> testList){
testList.add(new Student("273",98));
testList.add(new Student("283",88));
testList.add(new Student("243",28));
testList.add(new Student("273",58));
testList.add(new Student("283",68));
testList.add(new Student("243",98));
}
public static void statistics(List<Student> testList,Map<String,ClassRoom> rooms){
for(Student temp:testList){
String classNo = temp.getNo();
if(rooms.get(classNo)==null){//判断根据学生的班号能否找到一个班级,若有,直接累加分数,若无,新建一个班级,再累加分数
ClassRoom room = new ClassRoom();
rooms.put(classNo, room);
room.setTotalScore(room.getTotalScore()+temp.getScore());
room.getList().add(temp);
} else {
ClassRoom room = rooms.get(classNo);
room.setTotalScore(room.getTotalScore()+temp.getScore());
room.getList().add(temp);
}
}
}
public static void printScore(Map<String,ClassRoom> rooms){
Set<Map.Entry<String,ClassRoom>> a =rooms.entrySet();
Iterator<Map.Entry<String,ClassRoom>> itr = a.iterator();
while(itr.hasNext()){
Map.Entry<String, ClassRoom> tempRoom = itr.next();
String tempNo = tempRoom.getKey();
int tempTotalScore = tempRoom.getValue().getTotalScore();
int tempNum = tempRoom.getValue().getList().size();
System.out.println("班级:"+tempNo+" 总分:"+tempTotalScore+" 平均分:"+tempTotalScore/tempNum);
}
}
}
package test121;
public class Student {
private String no;
private int score;
public void setNo(String no){
this.no = no;
}
public String getNo(){
return no;
}
public void setScore(int score){
this.score = score;
}
public int getScore(){
return score;
}
public Student(){
}
public Student(String no,int score){
this.no = no;
this.score = score;
}
}