Java기초

[Java]Map<E> 성적관리

jackypark 2022. 7. 7. 23:05

Main 실행 클래스

앞 두 성적관리와 다른 점 Key값을 학번으로 둬서 관리했다.

import java.util.*;
public class MapScoreManager {
	Map<String,Student> hashMap=new HashMap<>();
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		MapScoreManager sm=new MapScoreManager();
		for(;;) {
			System.out.println("1. 입력 2. 출력 3. 검색 4. 삭제 5. 수정 0. 종료");
			int num=sc.nextInt();
			if(num==1) {
				sm.input(sc);	// 입력메소드 실행
			}else if (num==2) {
				sm.output(sc); // 출력 메소드 실행
			}else if(num==3) {
				sm.searchInfo(sc);//검색 메소드
			}else if(num==4) {
				sm.deleteInfo(sc);//삭제 메소드
			}else if(num==5) {
				sm.modifyInfo(sc);//수정메소드
			}else if(num==0) {
				System.exit(0);
			}else {
				System.out.println("잘못입력하셨습니다");
			}	
		}
	}
	public void input(Scanner sc) {// 데이터 입력
		System.out.println("학생 이름을 입력하시오");
		String name=sc.next();
		System.out.println("학과 를 입력하시오");
		String department=sc.next();
		String studentNum=null;
		for(;;) {
			System.out.println("학번을 입력하시오");
			studentNum=sc.next();
			if(hashMap.containsKey(studentNum)) {
				System.out.println("중복된 학번이있습니다 다시입력하시오");
				continue;
			}else {	
				break;
			}
		}
		System.out.println("국어 성적입력");
		int kor=sc.nextInt();
		System.out.println("수학 성적입력");
		int math=sc.nextInt();
		System.out.println("영어 성적입력");
		int eng=sc.nextInt();		
		Student stu=new Student(department,name,kor,eng,math);
		hashMap.put(studentNum, stu);
	}
	public void output(Scanner sc) {
		System.out.println("-----------출력------------");
		System.out.println("1. 성적순 출력 2. 이름순 출력");
		int num=sc.nextInt();
		int max=0;
		List<Map.Entry<String,Student>> listScore=new ArrayList<Map.Entry<String,Student>>(hashMap.entrySet());//정렬을 하려면 list로 만들어야함
		if(num==1) {
			System.out.println("----------------성적순 출력----------------------");
			Collections.sort(listScore,new ScoreComparator().reversed());//성적 오름차순
			for(Map.Entry<String, Student> entry : listScore) {
				System.out.println("학번:"+entry.getKey()+"\t\t "+entry.getValue().toString());//출력
			}
		}else if(num==2) {
			System.out.println("----------------이름순 출력----------------------");
			Collections.sort(listScore,new NameComparator());// 이름 가나다 순
			for(Map.Entry<String, Student> entry : listScore) {
				System.out.println("학번:"+entry.getKey()+"\t\t"+entry.getValue().toString());//출력
			}
		}
	}
	public void searchInfo(Scanner sc) {
		for(;;) {
			int flag=0;
			System.out.println("1.이름 검색 2. 학과검색 3. 학번검색 0. 검색종료");
			int n=sc.nextInt();
			if(n==1) {//이름검색
				System.out.println("검색하실 이름을 입력해주세요");
				String name=sc.next();
				for(Map.Entry<String, Student> en: hashMap.entrySet()) {
					if(name.equals(en.getValue().getName())) {
						System.out.println("학번:"+en.getKey()+"\t\t"+en.getValue().toString());
						flag=1;
					}					
				}				
			}else if(n==2) {//학과 검색
				System.out.println("검색하실 학과을 입력해주세요");
				String dep=sc.next();
				for(Map.Entry<String, Student> en: hashMap.entrySet()) {
					if(dep.equals(en.getValue().getDepartment())) {
						System.out.println("학번:"+en.getKey()+"\t\t"+en.getValue().toString());
						flag=1;
					}					
				}	
			}else if(n==3) {// 학번 검색
				System.out.println("검색하실 학번을 입력해주세요");
				String num=sc.next();
				for(String e: hashMap.keySet()) {
					if(num.equals(e)) {
						System.out.println("학번: "+e+hashMap.get(e).toString()); // value 리턴
						flag=1;
					}
				}				
			}else if(n==0) {
				break;
			}
			if(flag==0) {//flag가 0이면 찾는 값이없는것이다.
				System.out.println("찾는 data가 존재 하지않습니다.");
				continue;
			}else {
				break;
			}
		}
	}
	public void deleteInfo(Scanner sc) {
		for(;;) {
			int flag=0;
			System.out.println("삭제할 학번을 입력하세요 0.뒤로가기");
			String stuNum=sc.next();			
			for(String e: hashMap.keySet()) {
				if(stuNum.equals(e)) {
					System.out.println("학번: "+e+hashMap.get(e).toString()); // value 리턴
					flag=1;
					for(;;) {
						System.out.println("위학생의 정보를 삭제하시겠습니까? 1.예 2. 아니오");
						int n=sc.nextInt();
						if(n==1) {
							hashMap.remove(e);// 해당키값가지고있는객체 제거
							System.out.println("삭제완료");
							break;
						}else if(n==2){
							break;
						}else {
							System.out.println("잘못된값 입력");
							continue;
						}
					}
					break;
				}
				
			}
			if(flag==0) {//flag가 0이면 찾는 값이없는것이다.
				System.out.println("삭제할 학번이 존재 하지않습니다.");
				continue;
			}else if(stuNum.charAt(0)=='0'){// 삭제종료
				break;
			}else {
				break;
			}
		}
	}
	public void modifyInfo(Scanner sc) {
		for(;;) {
			int flag=0;
			System.out.println("수정할 학번을 입력하세요 0.변경종료");
			String stuNum=sc.next();
			for(String e: hashMap.keySet()) {
				if(stuNum.equals(e)) {
					System.out.println("학번: "+e+hashMap.get(e).toString()); // value 리턴
					flag=1;
					for(;;) {
						System.out.println("1.이름변경 2. 학과변경 3. 성적변경 0.뒤로가기");
						int n=sc.nextInt();
						if(n==1) {
							System.out.println("이름 입력: ");
							String name=sc.next();
							hashMap.get(e).setName(name);// 이름변경
							System.out.println("이름변경완료");
							break;
						}else if(n==2){
							System.out.println("전과할 학과 입력: ");
							String dep=sc.next();
							hashMap.get(e).setDepartment(dep);//학과변경
							break;
						}else if(n==3){
							System.out.println("어떤 성적을 변경?");
							System.out.println("1.국어 성적 2. 영어 성적 3. 수학 성적 ");
							int s=sc.nextInt();
							int score=0;
							switch(s) {							
							case 1:
								System.out.println("변경된 국어 성적 입력");
								score=sc.nextInt();
								hashMap.get(e).setKor(score);//국어성적 변경
								break;
							case 2:
								System.out.println("변경된 영어 성적 입력");
								score=sc.nextInt();
								hashMap.get(e).setEng(score);//영어성적 변경
								break;
							case 3:
								System.out.println("변경된 수학 성적 입력");
								score=sc.nextInt();
								hashMap.get(e).setMath(score);//수학성적변경
								break;	
							}
							break;
						}else if(n==0){
							System.out.println("뒤로가기");
							break;
						}else {
							System.out.println("잘못된값 입력");
							continue;
						}
					}
					break;
				}
			}
			if(flag==0) {//flag가 0이면 찾는 값이없는것이다.
				System.out.println("수정할 학번이 존재 하지않습니다.");
				continue;
			}else if(stuNum.charAt(0)=='0'){// 삭제종료
				break;
			}else {
				break;
			}
		}
	}
}

Student에서 학번 제외

import java.util.Objects;

public class Student{
	private String name,studentNum,department; //이름 학번 학과
	private Subject kor,math,eng;
	private float avg; //평균
	private int total;// 총점
	public Student() {
		kor=new Subject();
		math=new Subject();
		eng=new Subject();
	}
	public Student(String department,String name,int kor,int eng,int math) {
		this.name=name;
		this.department=department;
		this.kor=new Subject(kor);
		this.eng=new Subject(eng);
		this.math=new Subject(math);
		
		total=this.getKor()+this.getEng()+this.getMath();
		avg=total/3.f;
	}
	void setDepartment(String dep) {
		this.department=dep;	
	}
	public String getDepartment() {
		return department;
	}
	void setName(String name) {
		this.name=name;	
	}
	public String getName() {
		return name;
	}
	void setStudentNum(String stn) {
		this.studentNum=stn;	
	}
	public String getStudentNum() {
		return studentNum;
	}
	public int getKor() {
		return kor.getScore();
	}

	public void setKor(int kor) {
		this.kor.setScore(kor);
	}
	public int getMath() {
		return math.getScore();
	}
	public void setMath(int math) {
		this.math.setScore(math);
	}
	public int getEng() {
		return eng.getScore();
	}
	public void setEng(int eng) {
		this.eng.setScore(eng);
	}
	public float getAvg() {
		return avg=getTotal()/3.f; // == total/3.0f;
	}
	public void setAvg(float avg) {
		this.avg = avg;
	}
	public int getTotal() {
		return total=kor.getScore()+eng.getScore()+math.getScore();
	}
	
	@Override
	public String toString() {
		return "이름: "+this.name+"\t"+" 학과: "+this.department+"\t"+" 국어: "+getKor()+ "\t"+" 영어: "+getEng()
				+"\t"+" 수학: "+getMath()+"\t"+" 총점: "+getTotal()+"\t"+" 평균: "+getAvg();
	}

}

Comparator는 살짝 바뀌었다. Map.Entry를 받기 때문

import java.util.*;

public class ScoreComparator implements Comparator<Map.Entry<String,Student>>{// 성적비교 내림차순
	@Override
	public int compare(Map.Entry<String,Student> stu1,Map.Entry<String,Student> stu2) {
		if(stu1.getValue().getTotal()>stu2.getValue().getTotal()) {
			return 1;
		}else if(stu1.getValue().getTotal()<stu2.getValue().getTotal()) {
			return -1;
		}
		return -1;
	}
}

public class NameComparator implements Comparator <Map.Entry<String,Student>>{//이름 가나다순 정렬
	@Override
	public int compare(Map.Entry<String,Student> stu1,Map.Entry<String,Student> stu2) {
		if(stu1.getValue().getName().compareTo(stu2.getValue().getName())<0) {
			return -1;
		}else if(stu1.getValue().getName().compareTo(stu2.getValue().getName())==0) {
			return -1;
		}
		return 1;
	}
}

틈틈이 코드를 좀 더 좋은 방향으로 수정해 나가야 할 것 같다.