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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值