Java기초

[Java]Set<E> 성적관리

jackypark 2022. 7. 7. 22:59

Main 실행 클래스

import java.util.*;
 class SetScoreManager {
	Set<Student> setTree=new TreeSet<Student>(new ScoreComparator().reversed());
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		SetScoreManager sm=new SetScoreManager();
		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;
		int flag=0;
		
		for(;;) {
			Iterator<Student> iterator=setTree.iterator();
			flag=0;
			System.out.println("학번 를 입력하시오");
			studentNum=sc.next();
			while(iterator.hasNext()) {
				Student sNum=iterator.next();
				if(studentNum.equals(sNum.getStudentNum())) {
					System.out.println(studentNum+"학번은 중복된 학번이라 입력을 다시해주세요.");
					flag=1;
					break;
				}				
			}
			if(flag==1) {
				continue;
			}else if(flag==0) {
				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,studentNum,kor,eng,math);
		setTree.add(stu);
	}
	public void output(Scanner sc) {
		System.out.println("-----------출력------------");
		System.out.println("1. 성적순 출력 2. 이름순 출력");
		int num=sc.nextInt();
		if(num==1) {
			System.out.println("----------------성적순 출력----------------------");
			for(Student s: setTree) {
				System.out.println(s.toString());
			}
		}else if(num==2) {
			System.out.println("----------------이름순 출력----------------------");
			TreeSet<Student>nSetTree=new TreeSet<Student>(new NameComparator());
			nSetTree.addAll(setTree);
			for(Student s: nSetTree) {
				System.out.println(s.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();
				Iterator<Student> iterator=setTree.iterator();
				while(iterator.hasNext()) {
					Student sName=iterator.next();
					if(name.equals(sName.getName())) {
						System.out.println(sName.toString());
						flag=1;
					}		
				}
			}else if(n==2) {//학과검색
				System.out.println("검색하실 학과을 입력해주세요");
				String dep=sc.next();
				Iterator<Student> iterator=setTree.iterator();
				while(iterator.hasNext()) {
					Student sDep=iterator.next();
					if(dep.equals(sDep.getDepartment())) {
						System.out.println(sDep.toString());
						flag=1;
					}		
				}
			}else if(n==3) {//학번검색
				System.out.println("검색하실 학번을 입력해주세요");
				String num=sc.next();
				Iterator<Student> iterator=setTree.iterator();
				while(iterator.hasNext()) {
					Student sNum=iterator.next();
					if(num.equals(sNum.getStudentNum())) {
						System.out.println(sNum.toString());
						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();
			Iterator<Student> iterator=setTree.iterator();
			while(iterator.hasNext()) {
				Student sNum=iterator.next();
				if(stuNum.equals(sNum.getStudentNum())) {
					System.out.println(sNum.toString());
					flag=1;
					for(;;) {
						System.out.println("위학생의 정보를 삭제하시겠습니까? 1.예 2. 아니오");
						int n=sc.nextInt();
						if(n==1) {
							setTree.remove(sNum);
							System.out.println("삭제완료");
							break;
						}else if(n==2){
							break;
						}else {
							System.out.println("잘못된값 입력");
							continue;
						}
					}
					break;// while문 나가
				}		
			}
			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();
			Iterator<Student> iterator=setTree.iterator();
			while(iterator.hasNext()) {
				Student sNum=iterator.next();
				if(stuNum.equals(sNum.getStudentNum())) {
					System.out.println(sNum.toString());
					flag=1;
					for(;;) {
						System.out.println("1.이름변경 2. 학과변경 3. 성적변경 0.뒤로가기");
						int n=sc.nextInt();
						if(n==1) {
							System.out.println("이름 입력: ");
							String name=sc.next();
							sNum.setName(name);
							System.out.println("이름변경완료");
							break;
						}else if(n==2){
							System.out.println("전과할 학과 입력: ");
							String dep=sc.next();
							sNum.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();
								sNum.setKor(score);
								break;
							case 2:
								System.out.println("변경된 영어 성적 입력");
								score=sc.nextInt();
								sNum.setEng(score);
								break;
							case 3:
								System.out.println("변경된 수학 성적 입력");
								score=sc.nextInt();
								sNum.setMath(score);
								break;	
							}
							break;
						}else if(n==0){
							System.out.println("뒤로가기");
							break;
						}else {
							System.out.println("잘못된값 입력");
							continue;
						}
					}
					break;// while문 나가
				}		
			}
			if(flag==0) {//flag가 0이면 찾는 값이없는것이다.
				System.out.println("수정할 학번이 존재 하지않습니다.");
				continue;
			}else if(stuNum.charAt(0)=='0'){// 삭제종료
				break;
			}else {
				break;
			}
		}
	}
 }

Student 클래스 overriding 한것 hashset은 equals와 hashcode를 오버라이딩해야하지만 TreeSet는 데이터 크기로 비교하기 떄문에 compareto를 오버라이딩 한다. 하지만 나는 comparator class를 사용해서 오버라이딩하도록했다.

import java.util.*;

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,String studentNum,int kor,int eng,int math) {
		this.name=name;
		this.department=department;
		this.studentNum=studentNum;
		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"+" 학번: "+this.studentNum+"\t"+" 국어: "+getKor()+ "\t"+" 영어: "+getEng()
				+"\t"+" 수학: "+getMath()+"\t"+" 총점: "+getTotal()+"\t"+" 평균: "+getAvg();
	}
    @Override
    public int compareTo(Student stu) {
      if(stu instanceof Student) {
         if(this.getClassNum().equals(stu.getClassNum())) {
            return 0;
         }
      }
      else return 1;
     }

}

성적 비교 Comparator은 List<E>한 클래스와 동일인줄 알았으나....

setTree는 이 데이터 크기로 비교해서 return 0을 하게 되면 데이터가 같다고 판단하여 버려 버린다

그래서 setTree에서 성적순으로 정렬 하거나 이름순으로 굳이굳이 굳이 정렬 하려면 return-1을 하면 버리진않은데 효율 적인 코드는 아닌 것 같다.