Java基础—学生成绩操作系统
- 2019 年 12 月 17 日
- 筆記
已知如下:
下表为某班级四次考试成绩单,
1. 要求使用HashMap<String,Integer>存储每次考试的成绩(key键为姓名,value为成绩)。
2. 要求使用LinkedList存储考试次数,有几次考试就有几个HashMap
3. 注意:后台用户是知道学生姓名的
形式如:LinkedList<HashMap<String,Integer>>
姓名 |
第一次考试成绩 |
第二次考试成绩 |
第三次考试成绩 |
第四次考试成绩 |
---|---|---|---|---|
张三 |
80 |
88 |
86 |
88 |
李四 |
65 |
75 |
67 |
80 |
王五 |
35 |
45 |
55 |
59 |
薛六 |
90 |
92 |
98 |
88 |
赵七 |
70 |
75 |
65 |
68 |
要求是实现的功能
(1)查询某次考试的总成绩?(具体考试次数由后台用户输入Scanner决定)。
(2)查询某个学生的总成绩?(具体学生由后台用户输入Scanner决定)。
(3)查询某个学生的平均成绩?(具体学生由后台用户输入Scanner决定)。
(4)查询全班平均分最高的一次考试成绩是哪次,并输出平均成绩的具体值。
(5)查询某个学生的某次考试成绩(学生姓名和考试次数均由后台用户输入)。
(6) 使用TreeMap对学生总成绩进行排名输出
提示:
例如第一次考试成绩,应该存储为如下格式:
HashMap<String, Integer> m = newHashMap<String, Integer>();
m.put(“张三”, 80);
m.put(“李四”, 65);
m.put(“王五”, 35);
m.put(“薛六”, 90);
m.put(“赵七”, 70);
答案;
1、首先新建一个类,将学生的姓名、成绩封装。
public class Scores { private int times; private String name; private int score; private String[] names = new String[]{"张三", "李四", "王五", "薛六", "赵七"}; public String[] getNames() { return names; } public int getTimes() { return times; } public void setTimes(int times) { this.times = times; } public String getName() { return name; } public void setNames(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } }
2、再建一个类,去实现题目要求的6个功能。其中第六个功能需要用TreeMap进行排序,所以比较麻烦。为了能实现对TreeMap中的值的排序,需要再建一个类调用Comparable接口,同时重写compareTo()方法。
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; import java.util.TreeMap; public class ScoresService{ Scores stuScores = new Scores(); Scanner scanner = new Scanner(System.in); //格式输出学生的姓名和成绩 public void output(LinkedList> lScores){ System.out.println("+---------------+-----------------------+-----------------------+-----------------------+-----------------------+"); System.out.println("|t姓名t|" + "t第一次考试成绩t|"+"t第二次考试成绩t|"+"t第三次考试成绩t|"+"t第四次考试成绩t|"); System.out.println("+---------------+-----------------------+-----------------------+-----------------------+-----------------------+"); for(int i = 0 ; i < stuScores.getNames().length ; i ++){ System.out.println("|t" + stuScores.getNames()[i] + "t|t" + lScores.get(0).get(stuScores.getNames()[i]) + "tt|t" + lScores.get(1).get(stuScores.getNames()[i]) + "tt|t" +lScores.get(2).get(stuScores.getNames()[i]) + "tt|t" +lScores.get(3).get(stuScores.getNames()[i]) + "tt|"); System.out.println("+---------------+-----------------------+-----------------------+-----------------------+-----------------------+"); } } //查询某次考试的总成绩 public void queryExamSum(LinkedList> lScores){ int sum = 0; System.out.println("请输入考试次序:"); int time = scanner.nextInt(); for(int i = 0 ; i < stuScores.getNames().length ; i ++){ sum += lScores.get(time - 1).get(stuScores.getNames()[i]); } System.out.println("第" + time + "次考试的总分为:" + sum); } //查询某位考生四次考试的总成绩 public void queryStudentSum(LinkedList> lScores){ int sum = 0; System.out.println("请输入学生姓名:"); String name = scanner.next(); for(int i = 0 ; i < lScores.size() ; i ++){ sum += lScores.get(i).get(name); } System.out.println(name + "四次考试的总分为:" + sum); } //查询某位考生的平均分 public void queryStudentAverageScore(LinkedList> lScores){ int sum = 0; System.out.println("请输入学生姓名:"); String name = scanner.next(); for(int i = 0 ; i < lScores.size() ; i ++){ sum += lScores.get(i).get(name); } int avg = sum / lScores.size(); System.out.println(name + "四次考试的平均分为:" + avg); } //查询历次考试中平均分最高的一次, 并输出该次平均分 public void queryHighestAverage(LinkedList> lScores){ int sum; double maxAvg = 0; int time = 0; for(int i = 0 ; i < lScores.size() ; i ++){ sum = 0; for(int j = 0 ; j < stuScores.getNames().length ; j ++){ sum += lScores.get(i).get(stuScores.getNames()[j]); } double avg = sum / stuScores.getNames().length; System.out.println("第" + (i + 1) + "次考试全班的平均分为:" + avg); if(maxAvg < avg){ maxAvg = avg; time = i + 1; } } System.out.println("全班平均分最高的一次考试是第" + time + "次, 该次平均分为:" + maxAvg); } //查询某同学的某次考试成绩 public void queryStudentAndExamSum(LinkedList> lScores){ int score = 0; System.out.println("请输入考试次序:"); int time = scanner.nextInt(); System.out.println("请输入想要查询的同学的姓名:"); String name = scanner.next(); score = lScores.get(time - 1).get(name); System.out.println(name + "同学的第" + time + "次的考试成绩为:" + score); } //使用TreeMap对学生总成绩进行排名输出 public void SumSortByTreeMap(LinkedList> lScores){ HashMap stuSum = new HashMap(); int sum = 0; for(int i = 0 ; i < stuScores.getNames().length ; i ++){ sum = 0; for(int j = 0 ; j < lScores.size() ; j ++){ sum += lScores.get(j).get(stuScores.getNames()[i]); stuSum.put(stuScores.getNames()[i], sum); } } //将HashMap传入StuSum,使用对value(即历次考试总分)排序的compareTo()方法进行排序 StuSum tempMap = new StuSum(stuSum); //将传出的HashMap装入TreeMap TreeMap sortedMap = new TreeMap(tempMap); sortedMap.putAll(stuSum); //将TreeMap转化为Entry类,该类具有TreeMap的键(Key)和值(Value) Set> sortedSet = sortedMap.entrySet(); //将Entry装入迭代器,进行遍历输出 Iterator> iter = sortedSet.iterator(); while(iter.hasNext()){ Entry type = (Entry) iter.next(); String k = type.getKey(); int v = type.getValue(); System.out.println(k + "<----------->" + v); } } }
import java.util.Comparator; import java.util.Map; public class StuSum implements Comparator{ Map map; public StuSum(Map map){ this.map = map; } @Override public int compare(String s1, String s2) { // TODO Auto-generated method stub if(map.get(s1) >= map.get(s2)){ return -1; }else{ return 1; } } }
3.最后,在主方法中调用上面的各个方法进行测试即可。
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Scanner; import java.util.Set; public class ScoresDemo { public static void main(String[] args) { Scores stuScores = new Scores(); ScoresService ss = new ScoresService(); LinkedList> lScores = new LinkedList>(); Scanner scanner = new Scanner(System.in); //以 i 来计考试次数 for(int i = 0; i < 4; i ++){ HashMap hScores = new HashMap(); //以 j 来计第几个考生的成绩 for(int j = 0; j < stuScores.getNames().length; j ++){ System.out.println("请输入" + stuScores.getNames()[j] + "的第" + (i + 1) + "门的成绩:"); int n = scanner.nextInt(); hScores.put(stuScores.getNames()[j], n); } lScores.add(hScores); } //遍历输出 ss.output(lScores); ss.queryExamSum(lScores); ss.queryHighestAverage(lScores); ss.queryStudentAndExamSum(lScores); ss.queryStudentAverageScore(lScores); ss.queryStudentSum(lScores); ss.SumSortByTreeMap(lScores); } }