본문 바로가기
JAVA/Collection

StudentTest(학생 등수)

by 미눅스[멘토] 2023. 6. 23.
728x90
package kr.or.ddit.basic;

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

/*
 *  문제) 학번, 이름, 국어정수, 영어점수, 수학점수 , 총점, 등수를 멤버로 갖는 Student클래스를 만든다.
 *  이 Student클래스의 생성자에서는 학번,이름,국어점수,영어점수, 수학점수만 매개변수로 받아서Student 초기화 처리를 한다.
 *  
 *  이 Student객체는 List에 저장하여 관리한다.
 *  
 *  List에 저장된 데이터들을 학번의 오름차순으로 정렬할 수있는 내부 정렬 기준을 구현하고,
 *  총점의 역순으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬되는 외부 정렬 기준 클래스를 작성하여
 *  정렬된 결과를 출력하시오.
 *  
 *  등수는 List에 전체 데이터가 추가된 후에 구해서 저장되도록 한다.(StudentTest클래스에 처리)
 */

public class StudentTest {
	
	// 등수를 구하느느 메서드
	public void createRank(List<Student> rankStdList) {
		for(Student std1 : rankStdList) { //기준 데이터를 구하기 위한 반복문
			int rank =1; //처음에는 등수를 1로 설정해 놓고 시작한다.
			
			for(Student std2 : rankStdList ) {  //비교할 대상을 나타내는 반복문
				
				if (std1.getTotalScore() < std2.getTotalScore()) { //기준값보다 비교 대상이 크면 rank값을 증가시킨다.
					rank++;
				}
			}
			//구해진 등수를 기준 데이터의 rank변수에 저장한다.
			std1.setRank(rank);
		}
		
	}
	
	public static void main(String[] args) {
		List<Student> list = new ArrayList<>();
		list.add(new Student(12, "이순신", 80, 90, 100));
		list.add(new Student(11, "일지매", 10, 20, 30));
		list.add(new Student(15, "성춘향", 20, 30, 40)); //총점이 같음
		list.add(new Student(13, "강감찬", 30, 20, 40)); //총점이 같음
		list.add(new Student(14, "정학도", 40, 50, 60));
		list.add(new Student(1, "이몽룡", 40, 50, 60));
		list.add(new Student(2, "임민우", 40, 50, 60));
		list.add(new Student(4, "돼지", 40, 50, 60));
		
		StudentTest test = new StudentTest();
		test.createRank(list);
		
		System.out.println("정렬전========================");
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("학번의 오름차순 내부정렬 후 ==================");
		Collections.sort(list);
		
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("섞은후================");
		Collections.shuffle(list);
		for (Student student : list) {
			System.out.println(student);
		}
		
		System.out.println("총점의 역순 외부정렬================");
		Collections.sort(list, new SortByTotal());
		for (Student student : list) {
			System.out.println(student);
		}
		
	}

	
	
	
	
}

class SortByTotal implements Comparator<Student> {
	@Override
	public int compare(Student stu1, Student stu2) {
//		if (stu1.getTotalScore() > stu2.getTotalScore()) {
//			return -1;
//		}else if (stu1.getTotalScore() < stu2.getTotalScore()) {
//			return 1;
//		}else if(stu1.getTotalScore() == stu2.getTotalScore()) {
//			return stu1.getName().compareTo(stu2.getName());
//			}
//		return 0;
//		}
		if (stu1.getTotalScore() == stu2.getTotalScore()) {  //총점이 같으면
			return stu1.getName().compareTo(stu2.getName());  //이름의 오름차순 정렬
		}else {
			return Integer.compare(stu1.getTotalScore(), stu2.getTotalScore()) *-1; //총점의 내림차순
		}
	}
}

//내부정렬 기준 학번의 오름차순
class Student implements Comparable<Student>  {
	private int id;
	private String name;
	private int koreanScore;
	private int englishScore;
	private int methScore;
	private int totalScore;
	private int rank;
	
	
	public Student(int id, String name, int koreanScore, int englishScore, int methScore) {
		this.id = id;
		this.name = name;
		this.koreanScore = koreanScore;
		this.englishScore = englishScore;
		this.methScore = methScore;
		setTotalScore(koreanScore + englishScore + methScore);
		
	}


	public int getId() {
		return id;
	}


	public void setId(int id) {
		this.id = id;
	}


	public String getName() {
		return name;
	}


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


	public int getKoreanScore() {
		return koreanScore;
	}


	public void setKoreanScore(int koreanScore) {
		this.koreanScore = koreanScore;
	}


	public int getEnglishScore() {
		return englishScore;
	}


	public void setEnglishScore(int englishScore) {
		this.englishScore = englishScore;
	}


	public int getMethScore() {
		return methScore;
	}


	public void setMethScore(int methScore) {
		this.methScore = methScore;
	}


	public int getTotalScore() {
		return totalScore;
	}


	public void setTotalScore(int totalScore) {
		this.totalScore = totalScore;
	}


	public int getRank() {
		return rank;
	}


	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", koreanScore=" + koreanScore + ", englishScore="
				+ englishScore + ", methScore=" + methScore + ", totalScore=" + totalScore + ", rank=" + rank + "]";
	}


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


	// 내부 정렬 기준은 현재 객체(this)와 매개변수(stu)에 저장되는 객체와 비교해서 처리한다.
	// 현재 객체(this)가 앞쪽 데이터, 매개변수에 저장된 객체가 뒤쪽 데이터라고 하고 코딩한다.
	@Override
	public int compareTo(Student stu) {
		
		//학번의 오름차순
		return Integer.compare(this.getId(),stu.getId());
		
//		if (this.getId()>stu.getId()) {
//			return 1;
//		}else if(this.getId() < stu.getId()) {
//			return -1;
//		}
//		else {
//			return 0;
//		}
	}

}

 

'JAVA > Collection' 카테고리의 다른 글

PropertiesTest  (0) 2023.06.23
PhonBookTest(전화번호 관리 예제)  (0) 2023.06.23
HotelTest(호텔예약)예제  (0) 2023.06.23
LottoStore(로또구입예제)  (0) 2023.06.22
VectorTest  (0) 2023.06.22