2020.10.21 고급자바 과제 완성 ! - ListSortTest3

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;
}
*/
}
}

댓글