专栏首页为学Java基础---学生成绩操作系统

Java基础---学生成绩操作系统

已知如下:

下表为某班级四次考试成绩单,

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]) + "\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;
		}
	}
}

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);
		
	}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础---简易提款机

    1.创建用户类User(包含卡号、姓名、密码、余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号、初始金额设置为0)。

    李志伟
  • 学生信息管理系统(使用数据库)

    2.新建操作类,因为这次要使用MySql数据库,所以要使用JDBC将Java与数据库链接起来。

    李志伟
  • Java基础---学生信息管理系统(借助Array List)

    1、通过键盘选择操作进行添加学生(学号,姓名,性别,年龄,成绩)的信息,这些信息通过数组存储。

    李志伟
  • Java 基础知识点(必知必会其二)

       1.如何将数字输出为每三位逗号分隔的格式,例如“1,234,467”?    1 package com.Gxjun.problem; 2 3 i...

    Gxjun
  • Java基础-注释

    java注释是不被编译器和解释器执行的语句。用于有关变量,方法,类或其他任何语句的解释。也可以隐藏程序代码。

    yuanyuan
  • 23种设计模式详解(四)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

    南风
  • 轻松又酷炫地实现弹幕效果——手把手教学

    更多代码,请查看我的github:https://github.com/shuaijia/JsPlayer ,喜欢的话就给个star!^_^

    蜻蜓队长
  • 23种设计模式详解(四)

    南风
  • C++中引用的本质

    引用是C++引入的重要机制,它使原来在C中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢?

    Dabelv
  • 递推算法的核心——公式(按照公式写递归) 顶

    以此我们得出兔子生崽的递推算法:其中有1对兔子,每个月都可以生一对兔子,但是任何的兔子都必须2个月大,即第3个月才有生育能力。

    算法之名

扫码关注云+社区

领取腾讯云代金券