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 |