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;
}
}
틈틈이 코드를 좀 더 좋은 방향으로 수정해 나가야 할 것 같다.
'Java기초' 카테고리의 다른 글
| [Java]Random 클래스 사용 로또생성기활용 (0) | 2022.07.11 |
|---|---|
| [Java]상속관계 간단급여관리 프로그램 Team Project (0) | 2022.07.10 |
| [Java]Set<E> 성적관리 (0) | 2022.07.07 |
| [Java] List 성적관리 (0) | 2022.07.07 |
| [Java] Interface and Inner Class (0) | 2022.07.05 |
댓글