HIGH JAVA List Sort 연습문제

어뮤즈온·2021년 1월 19일
0

고급자바

목록 보기
7/7

학번, 이름, 국어점수, 영어점수, 수학점수, 총점, 등수를 멤버로 갖는 Student클래스를 작성한다. 이 클래스의 생성자에서는 학번, 이름, 국어점수, 영어점수, 수학점수만 매개변수로 받아서 초기화 처리한다.

class Student implements Comparable<Student>{
	private int num;
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int score;
	private int rank;
	
	public Student(int num, String name, int kor, int eng, int math){
		this.num = num;
    		this.name = name;
    		this.kor = kor;
    		this.eng = eng;
    		this.math = math;
    		this.score = kor + eng + math;
    		this.rank = 1;
	}

	public int getNum() {
    		return num;
	}

	public void setNum(int num) {
    		this.num = num;
  	}	

  	 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 getEng() {
      		return eng;
   	}

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

   	public int getMath() {
      		return math;
   	}

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

     	public int getScore() {
     	 	return score;
   	}

   	public void setScore(int score) {
      		this.score = score;
   	}

   	public int getRank() {
      		return rank;
   	}

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

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

이 Student 객체는 List에 저장하여 관리한다.

public static void main(String[] args) {
	ArrayList<Student> list = new ArrayList<>();

	list.add(new Student(1, "홍길동", 50, 30, 80));
  	list.add(new Student(10, "이순신", 80, 50, 90));
 	list.add(new Student(3, "변학도", 50, 65, 56));
  	list.add(new Student(8, "김철수", 80, 75, 42));
  	list.add(new Student(6, "김영희", 15, 85, 42));
  	list.add(new Student(5, "강감찬", 58, 56, 55));
  	list.add(new Student(7, "이세종", 58, 56, 55));
  	list.add(new Student(4, "이덕재", 59, 95, 56));
 	list.add(new Student(9, "장희빈", 60, 80, 81));
  	list.add(new Student(2, "김지희", 89, 88, 95));
}

List에 저장된 데이터들을 학번의 오름차순으로 정렬할 수 있는 내부 정렬 기준을 구현하고,

class Student implements Comparable<Student>{
	@Override
  	public int compareTo(Student stu) {
		return Integer.compare(this.num, stu.getNum());
 	 }
}

public static void main(String[] args) {
	//학번의 오름차순(내부 정렬 기준)
  	Collections.sort(list);
      
 	System.out.println("학번 오름차순");
  	for(Student stu : list){
     		System.out.println(stu);
	}
	//학번 오름차순
	//Student [num=1, name=홍길동, kor=50, eng=30, math=80, score=160, rank=9]
	//Student [num=2, name=김지희, kor=89, eng=88, math=95, score=272, rank=1]
	//Student [num=3, name=변학도, kor=50, eng=65, math=56, score=171, rank=6]
	//Student [num=4, name=이덕재, kor=59, eng=95, math=56, score=210, rank=4]
	//Student [num=5, name=강감찬, kor=58, eng=56, math=55, score=169, rank=7]
	//Student [num=6, name=김영희, kor=15, eng=85, math=42, score=142, rank=10]
	//Student [num=7, name=이세종, kor=58, eng=56, math=55, score=169, rank=7]
	//Student [num=8, name=김철수, kor=80, eng=75, math=42, score=197, rank=5]
	//Student [num=9, name=장희빈, kor=60, eng=80, math=81, score=221, rank=2]
	//Student [num=10, name=이순신, kor=80, eng=50, math=90, score=220, rank=3]
}

총점의 역순(내림차순)으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬되는 외부 정렬 기준 클래스를 작성하여 정렬된 결과를 출력하시오.

class scoreDesc implements Comparator<Student> {

	@Override
  	public int compare(Student stu1, Student stu2) {
		if(stu1.getScore() > stu2.getScore()){
	    		return -1;
    		}else if(stu1.getScore() < stu2.getScore()){
      			return  1;
    		}else{
      			if(stu1.getName().compareTo(stu2.getName()) > 0){
	      			return -1;
      			}else if(stu1.getName().compareTo(stu2.getName()) < 0){
        			return 1;
			}else{
        			return 0;
	    		}
		}
	}
}

public static void main(String[] args) {
	//총점의 내림차순(외부 정렬 기준 클래스), 총점이 같으면 이름의 오름차순
  	Collections.sort(list, new scoreDesc());
  	System.out.println("총점 내림차순...");
  	for(Student stu : list){
	  	System.out.println(stu);
  	}
}
//총점 내림차순...
//Student [num=2, name=김지희, kor=89, eng=88, math=95, score=272, rank=1]
//Student [num=9, name=장희빈, kor=60, eng=80, math=81, score=221, rank=2]
//Student [num=10, name=이순신, kor=80, eng=50, math=90, score=220, rank=3]
//Student [num=4, name=이덕재, kor=59, eng=95, math=56, score=210, rank=4]
//Student [num=8, name=김철수, kor=80, eng=75, math=42, score=197, rank=5]
//Student [num=3, name=변학도, kor=50, eng=65, math=56, score=171, rank=6]
//Student [num=5, name=강감찬, kor=58, eng=56, math=55, score=169, rank=7]
//Student [num=7, name=이세종, kor=58, eng=56, math=55, score=169, rank=7]
//Student [num=1, name=홍길동, kor=50, eng=30, math=80, score=160, rank=9]
//Student [num=6, name=김영희, kor=15, eng=85, math=42, score=142, rank=10]

(등수는 List 전체 데이터가 추가된 후에 저장되도록 한다.)

public static void main(String[] args) {
	rank(list);
}

private static void rank(ArrayList<Student> list) {
	//석차
  	for (int i = 0; i < list.size(); i++) {
	  	for (int j = 0; j < list.size(); j++) {
	    		if (list.get(i).getScore() < list.get(j).getScore()) {
	      			int rank = list.get(i).getRank();
        			rank += 1;
        			list.get(i).setRank(rank);
      			}
    		}
  	}
}

샘풀이

학번, 이름, 국어점수, 영어점수, 수학점수, 총점, 등수를 멤버로 갖는 Student클래스를 작성한다. 이 클래스의 생성자에서는 학번, 이름, 국어점수, 영어점수, 수학점수만 매개변수로 받아서 초기화 처리한다.

class Student implements Comparable<Student>{
	private int num;
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int score;
	private int rank;
	
	public Student(int num, String name, int kor, int eng, int math){
		this.num = num;
    		this.name = name;
      		this.kor = kor;
    		this.eng = eng;
    		this.math = math;
    		this.score = kor + eng + math;
	}

	public int getNum() {
    		return num;
	}

	public void setNum(int num) {
    		this.num = num;
  	}

   	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 getEng() {
        	return eng;
   	}	

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

   	public int getMath() {
      		return math;
   	}

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

   	public int getScore() {
      		return score;
   	}

   	public void setScore(int score) {
      		this.score = score;
   	}

   	public int getRank() {
      		return rank;
   	}

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

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

이 Student 객체는 List에 저장하여 관리한다.

public static void main(String[] args) {
	StudentSam t = new StudentSam();
		
	List<Students> stdList = new ArrayList<>();
		
	stdList.add(new Students(1, "홍길동", 90, 95, 80));
	stdList.add(new Students(3, "성춘향", 90, 75, 70));
	stdList.add(new Students(7, "강감찬", 95, 95, 80));
	stdList.add(new Students(5, "변학도", 80, 95, 90));
	stdList.add(new Students(2, "일지매", 100, 85, 80));
	stdList.add(new Students(4, "이순신", 60, 65, 70));
	stdList.add(new Students(6, "이몽룡", 90, 100, 90));
}

List에 저장된 데이터들을 학번의 오름차순으로 정렬할 수 있는 내부 정렬 기준을 구현하고,

class Student implements Comparable<Student>{
	@Override
	public int compareTo(Students std) {
		return Integer.compare(this.num, std.getNum());
	}
}

public static void main(String[] args) {
	System.out.println("정렬전...");
	for(Students std : stdList){
		System.out.println(std);
	}
	System.out.println("-------------------------------------------------------------------------");
	System.out.println();
		
	//학번의 오름차순으로 정렬하기
	Collections.sort(stdList);
		
	System.out.println("학번의 오름차순 정렬 후...");
	for(Students std : stdList){
		System.out.println(std);
	}
}
//정렬전...
//Student2 [num=1, name=홍길동, kor=90, eng=95, mat=80, tot=265, rank=3]
//Student2 [num=3, name=성춘향, kor=90, eng=75, mat=70, tot=235, rank=6]
//Student2 [num=7, name=강감찬, kor=95, eng=95, mat=80, tot=270, rank=2]
//Student2 [num=5, name=변학도, kor=80, eng=95, mat=90, tot=265, rank=3]
//Student2 [num=2, name=일지매, kor=100, eng=85, mat=80, tot=265, rank=3]
//Student2 [num=4, name=이순신, kor=60, eng=65, mat=70, tot=195, rank=7]
//Student2 [num=6, name=이몽룡, kor=90, eng=100, mat=90, tot=280, rank=1]
//-------------------------------------------------------------------------

//학번의 오름차순 정렬 후...
//Student2 [num=1, name=홍길동, kor=90, eng=95, mat=80, tot=265, rank=3]
//Student2 [num=2, name=일지매, kor=100, eng=85, mat=80, tot=265, rank=3]
//Student2 [num=3, name=성춘향, kor=90, eng=75, mat=70, tot=235, rank=6]
//Student2 [num=4, name=이순신, kor=60, eng=65, mat=70, tot=195, rank=7]
//Student2 [num=5, name=변학도, kor=80, eng=95, mat=90, tot=265, rank=3]
//Student2 [num=6, name=이몽룡, kor=90, eng=100, mat=90, tot=280, rank=1]
//Student2 [num=7, name=강감찬, kor=95, eng=95, mat=80, tot=270, rank=2]

총점의 역순(내림차순)으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬되는 외부 정렬 기준 클래스를 작성하여 정렬된 결과를 출력하시오.

class SortByTotal implements Comparator<Students>{

	@Override
	public int compare(Students std1, Students std2) {
		if(std1.getTot() == std2.getTot()){
			return std1.getName().compareTo(std2.getName());
			//String 클래스는 내부 정렬 기준이 구현되어 있다.(default 오름차순)
		}else{
			return Integer.compare(std1.getTot(), std2.getTot()) * -1;
		}
	}
	
}

public static void main(String[] args) {
	// 총점의 역순으로 정렬하기
	Collections.sort(stdList, new SortByTotal());
		
	System.out.println("총점의 역순으로 정렬 후....");
	for(Students std : stdList){
		System.out.println(std);
	}
}
//총점의 역순으로 정렬 후....
//Student2 [num=6, name=이몽룡, kor=90, eng=100, mat=90, tot=280, rank=1]
//Student2 [num=7, name=강감찬, kor=95, eng=95, mat=80, tot=270, rank=2]
//Student2 [num=5, name=변학도, kor=80, eng=95, mat=90, tot=265, rank=3]
//Student2 [num=2, name=일지매, kor=100, eng=85, mat=80, tot=265, rank=3]
//Student2 [num=1, name=홍길동, kor=90, eng=95, mat=80, tot=265, rank=3]
//Student2 [num=3, name=성춘향, kor=90, eng=75, mat=70, tot=235, rank=6]
//Student2 [num=4, name=이순신, kor=60, eng=65, mat=70, tot=195, rank=7]

(등수는 List 전체 데이터가 추가된 후에 저장되도록 한다.)

//등수를 구하는 메서드
public void setRanking(List<Students> stdList){
//for(int i = 0; i < stdList.size(); i++){ //기준 데이터를 구하기위한 반복문
//  int rank = 1; //처음에는 1등으로 설정해 놓고 시작한다.
//		for(int j = 0; j < stdList.size(); j++){ //비교 대상을 나타내는 반복문
//			//기준보다 큰 값을 만나면 rank값을 증가시킨다.
//			if(stdList.get(i).getTot() < stdList.get(j).getTot()){
//				rank++;
//				}
//			} //for - j
//			//구해진 등수를 Student 객체의 rank변수에 저장한다.
//			stdList.get(i).setRank(rank);
//			
//		} //for - i
		
	for(Students std1 : stdList){ //기준 대상
		int rank = 1;
			
		for(Students std2 : stdList){ //비교 대상
			if(std1.getTot() < std2.getTot()){
				rank++;
			}
		}
		std1.setRank(rank);
	}
}
profile
Hello, world!

0개의 댓글