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을 하면 버리진않은데 효율 적인 코드는 아닌 것 같다.
'Java기초' 카테고리의 다른 글
| [Java]상속관계 간단급여관리 프로그램 Team Project (0) | 2022.07.10 |
|---|---|
| [Java]Map<E> 성적관리 (0) | 2022.07.07 |
| [Java] List 성적관리 (0) | 2022.07.07 |
| [Java] Interface and Inner Class (0) | 2022.07.05 |
| [Java]동적바인딩 정적바인딩 (0) | 2022.07.05 |
댓글