자바 객체 지향 프로그래밍/과제

24-01-19 숙제 학생정보 오름차순 , 섞기 , 내림차순 정리

JinEo 2024. 1. 22. 09:17

[1]. 최종 과제 내용

[1-1] 완성된 코드

package homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Homework1 {
	public static void main(String[] args) {		
		// 학생 정보
		List<Student> student = new ArrayList<Student>();
		student.add(new Student("1", "홍길동", 80, 90, 90));
		student.add(new Student("2", "이순신", 84, 93, 85
				));
		student.add(new Student("3", "일지매", 88, 97, 90));
		student.add(new Student("4", "변학도", 98, 92, 94));
		student.add(new Student("5", "춘향이", 100, 100, 100));
		
		// 총점과 평균 	
		for (Student std : student) {		//학생 리스트인 Student를 반복하여 각 학생 점보를 std 변수에 순차적으로 향상하는 변수입
			int kor = std.getKor(); 		
			int math = std.getMath();
			int eng = std.getEng();
			int sum = kor + math + eng;
			double avg = sum / 3.0;

			std.setSum(sum);			//std의 합계 필드에 계산된 합계 sum을 설정한다.
			std.setAvg(avg);			//std의 합계 필드에 계산된 평균 sum을 설정한다
		}
		
		// 등수 
		Collections.sort(student, new sumDesc());
		int i = 1;		// 동점자  x
		int j = i;		// 동점자  o
		int temp = 0;	// 이전 학생의 총점  총검같으면 같은등수
		for (Student std : student) {
			if(temp == std.getSum()) {	//이전 학생의 총점과 현재 학생의 총점이 같으면 동일한 등수 부여 
				std.setRank(j);
				i++;
			}else {						//총점이 다르면 등수 갱신후 j를 초기화하고 증가 
				std.setRank(i);
				j = i++;
			}
			temp = std.getSum();
		}


		// 리스트 섞기
		System.out.println("정렬 전: ");
		Collections.shuffle(student);				//셔플 해주는 함수
		for (Student std : student) {				//student 리스트에 있는 각 학생 std을 가져와서 
			System.out.println(std);				//system을 통해 해당 학생 객체의 toString() 메서드 호출을 하여 출력합니다.
		}
		System.out.println("");
		
		// 학번 오름차순
		Collections.sort(student);
		System.out.println("학번의 오름차순 정렬 후: ");
		for (Student std : student) {
			System.out.println(std);
		}		
		System.out.println("");
		
		// 총점의 역순으로 정렬, 총점이 같으면 학번의 내림차순으로 정렬
		System.out.println("총점, 학번의 내림차순 정렬 후: ");
		Collections.sort(student, new sumDesc());
		for (Student std : student) {
			System.out.println(std);
		}
	
	}
}


class sumDesc implements Comparator<Student>{
// 	총점 정렬기준은 외부클래스에서 제공
	@Override
	public int compare(Student std1, Student std2) {	
		if(std1.getSum() > std2.getSum()) {				//std1의 총점이 크면 std1이 std2보다 앞에 위치하도록 -1 반환 
			return -1;
		}else if(std1.getSum() == std2.getSum()) {		// 총점이 같으면 학번을 기준으로 내림차순으로 정렬 
			// 총점이 같을 경우 학번의 내림차순으로 정렬
			return std1.compareTo(std2)*(-1);			// compareTo 메서드는 학번을 기준으로 정렬하는데 , 여기에 -1을 곱해 내림차순으로 변경 
		}else {											// std2의 총점이 크면은 std2가 std1보다 앞에 위치하도록 1 반환 
			return 1;
		}
	}
	
}

// 	학번 정렬기준은 Student클래스 자체에서 제공 
class Student implements Comparable<Student>{
	String no;
	String name;
	int kor;
	int math;
	int eng;
	int sum;
	double avg;
	int rank;

	public Student(String no, String name, int kor, int math, int eng) {
		super();
		this.no = no;
		this.name = name;
		this.kor = kor;
		this.math = math;
		this.eng = eng;
	}

	@Override
	public String toString() {
		return "Student [no=" + no + ", name=" + name + ", kor=" + kor + ", math=" + math + ", eng=" + eng + ", sum="
				+ sum + ", avg=" + avg + ", rank=" + rank + "]";
	}

	public String getNo() {
		return no;
	}

	public void setNo(String no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

	public int getRank() {
		return rank;
	}

	public void setRank(int rank) {
		this.rank = rank;
	}

	@Override
	public int compareTo(Student std) {

		return this.getNo().compareTo(std.getNo());
	}
	
}

 

[2]. 학생 정보 입력 

package homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Homework1 {
	public static void main(String[] args) {		
		// 학생 정보
		List<Student> student = new ArrayList<Student>();
		student.add(new Student("1", "홍길동", 80, 90, 90));
		student.add(new Student("2", "이순신", 84, 93, 85
				));
		student.add(new Student("3", "일지매", 88, 97, 90));
		student.add(new Student("4", "변학도", 98, 92, 94));
		student.add(new Student("5", "춘향이", 100, 100, 100));

[3]  총점 과 평균 

		for (Student std : student) {		//학생 리스트인 Student를 반복하여 각 학생 점보를 std 변수에 순차적으로 향상하는 변수입
			int kor = std.getKor(); 		
			int math = std.getMath();
			int eng = std.getEng();
			int sum = kor + math + eng;
			double avg = sum / 3.0;

			std.setSum(sum);			//std의 합계 필드에 계산된 합계 sum을 설정한다.
			std.setAvg(avg);			//std의 합계 필드에 계산된 평균 sum을 설정한다
		}

[4] 등수 

	
		// 등수 
		Collections.sort(student, new sumDesc());
		int i = 1;		// 동점자  x
		int j = i;		// 동점자  o
		int temp = 0;	// 이전 학생의 총점  총검같으면 같은등수
		for (Student std : student) {
			if(temp == std.getSum()) {	//이전 학생의 총점과 현재 학생의 총점이 같으면 동일한 등수 부여 
				std.setRank(j);
				i++;
			}else {						//총점이 다르면 등수 갱신후 j를 초기화하고 증가 
				std.setRank(i);
				j = i++;
			}
			temp = std.getSum();
		}

[5] 리스트 섞기 

		// 리스트 섞기
		System.out.println("정렬 전: ");
		Collections.shuffle(student);				//셔플 해주는 함수
		for (Student std : student) {				//student 리스트에 있는 각 학생 std을 가져와서 
			System.out.println(std);				//system을 통해 해당 학생 객체의 toString() 메서드 호출을 하여 출력합니다.
		}
		System.out.println("");

 

[6] 학번 오름차순 

	// 학번 오름차순
		Collections.sort(student);
		System.out.println("학번의 오름차순 정렬 후: ");
		for (Student std : student) {
			System.out.println(std);
		}		
		System.out.println("");

 

[7] 총점의 역순으로 정렬 , 총점이 같으면 

	// 총점의 역순으로 정렬, 총점이 같으면 학번의 내림차순으로 정렬
		System.out.println("총점, 학번의 내림차순 정렬 후: ");
		Collections.sort(student, new sumDesc());
		for (Student std : student) {
			System.out.println(std);
		}

[8]. 총점 정렬 기준은 외부 클래스 [내림차순 정렬]

class sumDesc implements Comparator<Student>{
// 	총점 정렬기준은 외부클래스에서 제공
	@Override
	public int compare(Student std1, Student std2) {	
		if(std1.getSum() > std2.getSum()) {				//std1의 총점이 크면 std1이 std2보다 앞에 위치하도록 -1 반환 
			return -1;
		}else if(std1.getSum() == std2.getSum()) {		// 총점이 같으면 학번을 기준으로 내림차순으로 정렬 
			// 총점이 같을 경우 학번의 내림차순으로 정렬
			return std1.compareTo(std2)*(-1);			// compareTo 메서드는 학번을 기준으로 정렬하는데 , 여기에 -1을 곱해 내림차순으로 변경 
		}else {											// std2의 총점이 크면은 std2가 std1보다 앞에 위치하도록 1 반환 
			return 1;
		}
	}
	
}

[9] Getter Setter 

// 	학번 정렬기준은 Student클래스 자체에서 제공 
class Student implements Comparable<Student>{
	String no;
	String name;
	int kor;
	int math;
	int eng;
	int sum;
	double avg;
	int rank;

	public Student(String no, String name, int kor, int math, int eng) {
		super();
		this.no = no;
		this.name = name;
		this.kor = kor;
		this.math = math;
		this.eng = eng;
	}

	@Override
	public String toString() {
		return "Student [no=" + no + ", name=" + name + ", kor=" + kor + ", math=" + math + ", eng=" + eng + ", sum="
				+ sum + ", avg=" + avg + ", rank=" + rank + "]";
	}

	public String getNo() {
		return no;
	}

	public void setNo(String no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

	public int getRank() {
		return rank;
	}

	public void setRank(int rank) {
		this.rank = rank;
	}

	@Override
	public int compareTo(Student std) {

		return this.getNo().compareTo(std.getNo());
	}
	
}