已知如下:
下表为某班级四次考试成绩单,
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;
}
}
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]) + "\t\t|\t" +
lScores.get(1).get(stuScores.getNames()[i]) + "\t\t|\t" +lScores.get(2).get(stuScores.getNames()[i])
+ "\t\t|\t" +lScores.get(3).get(stuScores.getNames()[i]) + "\t\t|");
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;
}
}
}
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); } }