본문 바로가기
Java기초

[Java] List 성적관리

by jackypark 2022. 7. 7.

메인Class

import java.util.ArrayList;
import java.util.*;

public class ScoreManager {
	ArrayList<Student> arr=new ArrayList<Student>();
	
	public static void main(String[] args) {
		ScoreManager sm=new ScoreManager();
		Scanner sc=new Scanner(System.in);
		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; //중복 확인 true false를 알기위해 flag변수 생성
		for(;;) { // 학번 중복이면 안되니깐 중복된값 입력 불가
			flag=0;
			System.out.println("학번을 입력하시오");
			studentNum=sc.next();//학번입력
			for(int i=0;i<arr.size();i++) {
				if(arr.get(i).getStudentNum().equals(studentNum)) {// 만약에 입력한 학번과 같은 학번이 있으면
					System.out.println(studentNum+"학번은 중복된 학번이라 입력을 다시해주세요.");
					flag=1;//중복된 학번이있으면 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); //stu 객체 생성
		arr.add(stu);	//stu객체 arraylist에 저장
	}
	public void output(Scanner sc) {//데이터 전체출력 
		System.out.println("-----------출력------------");
		System.out.println("1. 성적순 출력 2. 이름순 출력");
		int num=sc.nextInt();// 선택 숫자 입력
		if(num==1) {
			System.out.println("----------------성적순 출력----------------------");
			Collections.sort(arr,new ScoreComparator().reversed());//arraylist 성적내림차순정렬
			for(int i=0;i<arr.size();i++) {// arraylist 사이즈만큼 출력
				System.out.println(arr.get(i).toString());
			}
		}else if(num==2) {
			System.out.println("----------------이름순 출력----------------------");
			Collections.sort(arr,new NameComparator());//성적높은순 정렬
			for(int i=0;i<arr.size();i++) {//arraylist 사이즈만큼 출력
				System.out.println(arr.get(i).toString());
			}
		}else {
			System.out.println("입력오류");
		}
	}
	
	public void searchInfo(Scanner sc) {
		for(;;) {
		int flag=0; //검색할 데이터가있엇는지 확인을 위해
		System.out.println("1. 이름검색 2. 학과검색 3.학번검색 4.성적 검색 0. 검색종료");
		int n=sc.nextInt();
			if(n==1) {// 이름검색
				System.out.println("검색하실 이름을 입력해주세요");
				String name=sc.next();
				for(int i=0;i<arr.size();i++) {
					if(arr.get(i).getName().equals(name)) {//찾는 이름이 리스트에 있으면 참
						infoDisp(i);//해당 인덱스값가진 사람 정보출력
						flag=1;
					}
				}				
			}else if(n==2) {	//학과 검색	
				System.out.println("검색하실 학과를 입력해주세요");
				String dep=sc.next();
				for(int i=0;i<arr.size();i++) {
					if(arr.get(i).getDepartment().equals(dep)) {// 찾는 학과가 리스트에 있으면 참
						infoDisp(i);// 해당 인덱스 값 가진 사람 정보 출력
						flag=1;
					}
				}
			}else if(n==3) {//학번 검색
				System.out.println("검색하실 학번를 입력해주세요");
				String stuNum=sc.next();
				for(int i=0;i<arr.size();i++) {
					if(arr.get(i).getStudentNum().equals(stuNum)) { // 찾는 학번이 리스트에 있으면 참
						infoDisp(i); //해당 인덱스 값 가진 사람 정보 출력
						flag=1;
					}
				}
			}else if(n==4) {//성적 검색
				System.out.println("어떤 성적을 검색?");
				System.out.println("1.국어 성적 2. 영어 성적 3. 수학 성적 ");
				int c=sc.nextInt();
				if(c==1) {//국어 성적 검색
					System.out.println("몇점이상 검색?");
					int score=sc.nextInt();
					Collections.sort(arr,new Comparator<Student>(){ //국어 성적순으로 정렬 익명클래스
						@Override
						public int compare(Student stu1,Student stu2) {
							if(stu1.getKor()<stu2.getKor()) {
								return 1; // stu1점수가 stu2 점수보다 작을시 위치 바꿈 내림차순이니깐
							}else if(stu1.getKor()>stu2.getKor()) {
								return -1;// 이동없음
							}
							return 0;//같으면 이동없음
						}
					});
					for(int i=0;i<arr.size();i++) {
						if(arr.get(i).getKor()>=score) {// 찾고자하는 성적 이상일시 출력
							infoDisp(i);
							flag=1;
						}
					}
				}else if(c==2) {
					Collections.sort(arr,new Comparator<Student>(){ //영어 성적순으로 정렬 익명클래스
						@Override
						public int compare(Student stu1,Student stu2) { //두객체 비교
							if(stu1.getEng()<stu2.getEng()) {
								return 1;
							}else if(stu1.getEng()>stu2.getEng()) {
								return -1;
							}
							return 0;
						}
					});
					System.out.println("몇점이상 검색?");
					int score=sc.nextInt();					
					for(int i=0;i<arr.size();i++) {
						if(arr.get(i).getEng()>=score) {
							infoDisp(i);
							flag=1;
						}
					}
				}else if(n==3) {
					Collections.sort(arr,new Comparator<Student>(){ //영어 성적순으로 정렬 익명클래스
						@Override
						public int compare(Student stu1,Student stu2) {
							if(stu1.getMath()<stu2.getMath()) {
								return 1;
							}else if(stu1.getMath()>stu2.getMath()) {
								return -1;
							}
							return 0;
						}
					});
					System.out.println("몇점이상 검색?");
					int score=sc.nextInt();					
					for(int i=0;i<arr.size();i++) {
						if(arr.get(i).getMath()>=score) {
							infoDisp(i);
							flag=1;
						}
					}
				}
				
			}else if(n==0) {//검색종료
				break;
			}
			if(flag==0) {//flag가 0이면 찾는 값이없는것이다.
				System.out.println("찾는 data가 존재 하지않습니다.");
				continue;
			}else {
				break;
			}
		}
	}
	public void infoDisp(int index) {//찾고하는 사람 인덱스 받아서 그사람만 출력
		System.out.println(arr.get(index).toString());
	}
	public void deleteInfo(Scanner sc) {//data 삭제
		for(;;) {
			int flag=0;
			System.out.println("삭제할 학번을 입력하세요 0.삭제종료");
			String stuNum=sc.next();
			for(int i=0;i<arr.size();i++) {
				if(arr.get(i).getStudentNum().equals(stuNum)) {// 리스트에 해당 학번이있으면 참
					infoDisp(i); //해당인덱스 사람 정보값 출력
					flag=1;
					for(;;) {
						System.out.println("위 학생의 정보를 삭제하시겠습니까? 1.예 2. 아니오");
						int n=sc.nextInt();
						if(n==1) {
							arr.remove(i); //i 정보 삭제
							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) {//data 수정
		for(;;) {
			int flag=0;
			System.out.println("수정할 학번을 입력하세요 0.변경종료");
			String stuNum=sc.next();
			for(int i=0;i<arr.size();i++) {
				if(arr.get(i).getStudentNum().equals(stuNum)) {//수정할 학번이 존재하는지 확인
					infoDisp(i); // 해당 인덱스 정보 출력
					flag=1;
					for(;;) {
						System.out.println("1.이름변경 2. 학과변경 3. 성적변경 0.뒤로가기");
						int n=sc.nextInt();
						if(n==1) {
							System.out.println("이름 입력: ");
							String name=sc.next();// 이름 입력
							System.out.println(arr.get(i).getName()+"을 "+name+"으로 변경완료");
							arr.get(i).setName(name);// 해당배열에 name값 set							
							break;
						}else if(n==2){
							System.out.println("전과할 학과 입력: ");
							String dep=sc.next();// 학과 입력
							System.out.println(arr.get(i).getDepartment()+"을 "+dep+"으로 변경완료");
							arr.get(i).setDepartment(dep);// 해당배열에 입력한 학과 set		
							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();
								arr.get(i).setKor(score);//입력한 성적으로 set
								break;
							case 2:
								System.out.println("변경된 영어 성적 입력");
								score=sc.nextInt();
								arr.get(i).setEng(score);//입력한 성적으로 set
								break;
							case 3:
								System.out.println("변경된 수학 성적 입력");
								score=sc.nextInt();
								arr.get(i).setMath(score);//입력한 성적으로 set
								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;
			}
		}
		
	}
}
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();
	}

}
public class Subject {
	private int score;
	
	public Subject() {}
	public Subject(int score) {this.score=score;}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}	
}

성적비교 + 이름순 비교 클래스

import java.util.Comparator;

public class ScoreComparator implements Comparator<Student>{// 성적비교
	@Override
	public int compare(Student stu1,Student stu2) {
		if(stu1.getTotal()>stu2.getTotal()) {
			return 1;
		}else if(stu1.getTotal()<stu2.getTotal()) {
			return -1;
		}
		return 0;
	}
	
}

import java.util.*;
public class NameComparator implements Comparator<Student>{// 이름 비교

	@Override
	public int compare(Student stu1, Student stu2) {
		return stu1.getName().compareTo(stu2.getName());
	}
}

다음은 Set<E>로 성적관리 차례이다

'Java기초' 카테고리의 다른 글

[Java]Map<E> 성적관리  (0) 2022.07.07
[Java]Set<E> 성적관리  (0) 2022.07.07
[Java] Interface and Inner Class  (0) 2022.07.05
[Java]동적바인딩 정적바인딩  (0) 2022.07.05
[JAVA] Class 관계 (has~ a) 포함오브젝트 활용  (0) 2022.06.30

댓글