Java用HashMap实现简单学生管理系统

需求

一开始是老师在MOOC上面发起了一个评论,然后大家需要回复(并附上自己的代码),自己在这里想了很多,就写写博客记录一下了。
在这里插入图片描述

想法

自己刚学习Java半学期,还是个小白,写写博客记录自己的学习历程吧= =

第一次构思

第一次想的是这样来实现

HashMap<String, HashMap> mapSystem = new HashMap<String, HashMap>();
HashMap<String, Double> mapScores = new HashMap<String, Double>();

然后自己后面实现的时候发现还是有很多不成熟的地方的,最终越写越乱,还是没有实现。

第二次构思

这次又换了一个思路,通过放个数组进去,来实现。

package java;
 
import java.util.HashMap;
import java.util.Scanner;
 
public class Test {
    public static void main(String args[]) {
        HashMap<String, Object[]> mapScores = new HashMap<String, Object[]>();
        Scanner in = new Scanner(System.in);
        String name = in.next();    //输入姓名
        Object[] scores = new Object[2];
        scores[0] = in.next();        //输入学科(scores[0]存放String类型的学科)
        scores[1] = in.nextDouble();    //输入学科相对应的分数(scores[1]存放double类型的分数)
        mapScores.put(name, scores);
         
        for(String a : mapScores.keySet()) {
            System.out.println("Key\tProject\tScore");
            System.out.println(a+"\t"+mapScores.get(a)[0]+"\t"+mapScores.get(a)[1]);
        }
    }
}

一开始放的是String[],然后因为上次听了软件工程方面的讲座,为了以后如果要实现的成绩排序,改成了Object[],然后长度为2的数组,第一个位置填学科,第二个位置填学科的成绩。
这样大致实现了一小部分的功能。。。。但还不是很满意= =
在这里插入图片描述
这还算不上一个系统吧(自己对系统的概念挺模糊的。。感觉这个不算),然后看了其他同学的评论,灵感又来了。

第三次构思

这次还是大致和第一次构思一样,然后相当于进化了一下 >▽<

HashMap<String, HashMap<String, Double>> mapSystem = new HashMap<String, <String, Double>>();

用这个构思,自己写了一个完整的一个系统出来

import java.util.HashMap;
import java.util.Scanner;

public class Test {
	Scanner in = new Scanner(System.in);
	HashMap<String, HashMap<String, Double>> mapSystem = new HashMap<String, HashMap<String, Double>>();
	
	void begin() {
		System.out.println("------------开始界面------------");
		System.out.println("\t输入1:录入信息");
		System.out.println("\t输入2:姓名查找信息");
		System.out.println("\t输入3:学科查找信息");
		System.out.println("\t输入0:退出系统");
		System.out.println("-----------------------------");
	}
	
	void choice(int number) {
		switch(number) {
		case 0:
			System.exit(0);
		case 1:
			System.out.println("依次输入姓名、学科、成绩(用空格分开):");
			this.informationInput(in.next(), in.next(), in.nextDouble());
			break;
		case 2:
			System.out.println("请输出检索的姓名:");
			this.informationFindByName(in.next());
			break;
		case 3:
			System.out.println("请输出检索的学科:");
			this.informationFindByProject(in.next());
			break;
		default:
			System.out.println("请输入正确序号!");
			break;
		}
	}
	
	void informationInput(String name, String project, double score) {
		HashMap<String, Double> map = new HashMap<String, Double>();
		map.put(project, score);
		mapSystem.put(name, map);
		System.out.println("信息添加成功!");
		System.out.println("信息如下:");
		System.out.println("Name\tProject=Score");
		System.out.println(name+"\t"+mapSystem.get(name));
	}
	
	void informationFindByName(String name) {
		for(String s : mapSystem.keySet()) {
			if(s.equals(name)) {
				System.out.println("查找结果如下:");
				System.out.println("Project\tScore");
				for(String p :mapSystem.get(s).keySet()) {
					System.out.println(p+"\t"+mapSystem.get(s).get(p));
				}
			}
			else System.out.println("NOT FOUND!");
		}
	}
	
	void informationFindByProject(String project) {
		for(String s : mapSystem.keySet()) {
			for(String p : mapSystem.get(s).keySet()) {
				if(p.equals(project)) {
					System.out.println("查找结果如下:");
					System.out.println("Name\tScore");
					System.out.println(s+"\t"+mapSystem.get(s).get(p));
				}
				else System.out.println("NOT FOUND!");
			}
		}
	}
	
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		Test test = new Test();
		while(true) {
			test.begin();
			test.choice(sc.nextInt());
		}
		
	}
}

运行是没有问题的,自己也测试了很多遍,还是可以简单使用的(数据库自己不会用。。寒假学好了再完善下),下面就是测试的一个例子。
在这里插入图片描述

其他的构思

自己除了这些构思还想了其他的一些想法,比如说构建一个二维数组每个位子存放三个数(姓名,学科,成绩),估计也可以实现

存在的问题

一个学生会有很多门课,绝对不止一门,而再用put方法录入键值对的话不会在后面append上,而是把之前的信息覆盖了。
录入的信息会覆盖之前的信息,这也是HashMap的一个特点啦。
一开始想的方案是换个次序,按照学科、姓名、成绩,这样就能一个人对应多个学科了,但是一个学科也能对应多个学生,这又是个问题。
那可能还是用数组参数?或者再定义一个HashMap,输入信息那块加点东西,传递给两个HashMap相应的值?再或者重头来,定义个二维数组来搞= =?

感谢阅读

因为自己大二的课程太满了,临近期末考试,自己没啥时间思考这些问题了,就到此为止啦,欢迎大家讨论解决方法,交流一些思想。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值