package kr.or.ddit.basic;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/*
* 문제) 학번(int), 이름(String), 국어점수, 영어점수, 수학점수, 총점, 등수를 멤버로 갖는
* student 클래스를 만든다.
*
*
*
*
*
* 이 student 클래스의 생성자에서는 학번, 이름, 국어점수, 영어점수, 수학점수만 매개변수로
* 받아서 초기화 처리를 한다.
*
* -이 Student 객체는 List에 저장하여 관리한다.
*
* - List 에 저장된 데이터들을 학번의 오름차순으로 정렬할 수 있는 내부 정렬 기준을 구현하고 ,
* 총점의 역순(내림차순)으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬이 되는
* 외부 정렬 기준 클래스를 작성하여 정렬된 결과를 출력하시오.
*
* (단, 등수는 List 에 전체 데이터가 추가된 후에 저장되도록 한다. )
*
*
*
*/
public class ListSortTest3 {
public void setRanking(List<Student> stdList) {
for(Student std : stdList) { //기준 데이터를 구하기 위한 반복 }
int rank = 1; // 처음에는 1등으로 설정해 놓고 시작한다.
for(Student std2 : stdList) { //비교 대상을 나타내는 반복문
// 기준보다 비교대상의 값이 크면 rank 값을 증가 시킨다.
if (std.getSum() < std2.getSum()) {
rank++;
}
}
std.setRank(rank);
}
}
public static void main(String[] args) {
ListSortTest3 stdTest = new ListSortTest3();
ArrayList<Student> studentList = new ArrayList<>();
//List<Student> stdList = new ArrayList<>() 로도 만들 수 있다.
studentList.add(new Student(1, "이수정" , 80, 50, 40 ));
studentList.add(new Student(3, "김난아" , 70, 50, 40 ));
studentList.add(new Student(5, "이사상" , 50, 40, 60 ));
studentList.add(new Student(2, "이수진" , 30, 30, 70 ));
studentList.add(new Student(4, "이성지" , 80, 50, 20 ));
//등수 구하는 메서드를 호출해서 등수를 구한다.
stdTest.setRanking(studentList);
System.out.println("처음 데이터 ");
for(Student stu : studentList ) {
System.out.println(stu);
//tostring 에 의해서 자동으로 출력이 되는것
} //for 문닫은것
System.out.println("----------------------------------------------");
Collections.sort(studentList);
System.out.println("학번으로 오름차순 정렬후...");
for(Student s : studentList) {
System.out.println(s);
} //for문
System.out.println("---------------------------------------");
Collections.sort(studentList, new SortSumDescName());
System.out.println("총점으로 내림차순후 동일총점은 이름으로 오름차순...");
for(Student st : studentList) {
System.out.println(st);
} //for 문
System.out.println("---------------------------------------");
} //메인
} //ListSortTest3 닫음
//Comparable 인터페이스는 compareTo() 메서드가 선언되어 있다.
class Student implements Comparable<Student>{ //내부정렬을 하려면 Comparable 이라는 내부정렬기준 구현해준것
private int number;
private String name;
private int korea;
private int english;
private int math;
private int sum;
private int rank;
//변수선언
//생성자 선언
public Student (int number, String name, int korea, int english , int math) {
super();
this.number = number;
this.name = name;
this.korea = korea;
this.english = english;
this.math = math;
this.sum = korea + english + math;
} //생성자 닫아준것
public void setRank(int rank) {
this.rank = rank;
}
//메소드를 만들어준다 나중에 값비교할 때 쓰일것
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKorea() {
return korea;
}
public void setKorea(int korea) {
this.korea = korea;
this.sum = korea + english + math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
this.sum = korea + english + math;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
this.sum = korea + english + math;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ",Korea=" + korea + ",english=" + english
+ ",math=" + math +",sum=" + sum + ",rank=" + rank + "]";
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return Integer.compare(this.getNumber(), o.getNumber()) ;
}
} //implements Comparable<Student> 닫음
class SortSumDescName implements Comparator<Student>{ //외부정렬기준은 Comparator다.
@Override
public int compare(Student sum1, Student sum2) {
if(sum1.getSum() > sum2.getSum()) {
return -1;
}else if(sum1.getSum() == sum2.getSum()) { //총점이 같을떄
return sum1.getName().compareTo(sum2.getName()) ;
}else {
return 1;
}
/*
* 또는 그냥 if(sum1.getSum() == sum2.getSum()) { //총점이 같을떄
return sum1.getName().compareTo(sum2.getName()) ;
else {
return Integer.compare(sum1.getSum() , sum2.getSum()) * -1;
}
*/
}
}
댓글
댓글 쓰기