ArrayList를 활용한 정렬 기준 만들기

9192 단어 자바자바

package kr.or.ddit.basic;

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

/*

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

public class StudentTest {

public static void main(String[] args) {
	String[] namesList =
		{"강나영", "강동환", "강태영", "곽지훈", "김서윤",
		 "김영훈", "김진석", "김충신", "박슬기", "박채린",
		 "손영태", "손영흔", "안정연", "이선우", "이수보",
		 "이주홍", "이중호", "임현정", "장유진", "정신애",
		 "조수경", "조하영", "조혜민", "허민정", "박지은"};
	
	ArrayList<Student> studentList = new ArrayList<Student>();
	ArrayList<Integer> scoreList = new ArrayList<Integer>();

	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 3; j++) {
			scoreList.add((int) (Math.random() * 101));
		}
		studentList.add(new Student(i + 1, namesList[i], scoreList.get(0), scoreList.get(1), scoreList.get(2)));
		scoreList.clear();
	}
	
	System.out.println("정렬 전");
	for (Student s : studentList) {
		System.out.println(s);
	}
	System.out.println("-------------------------------------------------------------------");

	// 학번의 오름차순으로 정렬(내부 정렬)
	Collections.sort(studentList);
	System.out.println("학번의 오름차순으로 정렬");
	for (Student s : studentList) {
		System.out.println(s);
	}
	System.out.println("-------------------------------------------------------------------");

	// 총점의 내림차순으로 정렬(총점이 같으면 이름의 오름차순으로 정렬, 외부 정렬)
	Collections.sort(studentList, new sumDesc());
	System.out.println("총점의 내림차순으로 정렬(총점이 같으면 이름의 오름차순으로 정렬)");
	for (Student s : studentList) {
		System.out.println(s);
	}
	System.out.println("-------------------------------------------------------------------");

	getRank(studentList);
	System.out.println("석차순으로 정렬");
	for (Student s : studentList) {
		System.out.println(s);
	}
	System.out.println("-------------------------------------------------------------------");
}

// 석차 구하기
private static void getRank(ArrayList<Student> studentList) {
	for (Student s1 : studentList) { // 기준
		int rank = 1;
		for (Student s2 : studentList) { // 비교
			if (s1.getSum() < s2.getSum()) {
				rank++;
			}
		}
		s1.setRank(rank);
	}
}

}

// 내부 정렬 - Comparable
// compateTo() 메서드를 재정의해야 한다.
class Student implements Comparable {
private int num;
private String name;
private int kor;
private int eng;
private int math;
private int sum;
private int rank;

public Student(int num, String name, int kor, int eng, int math) {
	super();
	this.num = num;
	this.name = name;
	this.kor = kor;
	this.eng = eng;
	this.math = math;
	this.sum = 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 getSum() {
	return sum;
}

public void setSum(int sum) {
	this.sum = sum;
}

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 + ", sum=" + sum
			+ ", rank=" + rank + "]";
}

// 학번의 오름차순으로 정렬(내부 정렬)
@Override
public int compareTo(Student s) {
	return Integer.compare(this.num, s.getNum());
}

}

// 총점의 내림차순으로 정렬, 총점이 같으면 이름의 오름차순으로 정렬(외부 정렬)
class sumDesc implements Comparator {

@Override
public int compare(Student s1, Student s2) {
	// 총점이 다르면 총점의 내림차순으로 정렬
	if (s1.getSum() != s2.getSum()) {
		return Integer.compare(s1.getSum(), s2.getSum()) * - 1;
	} else { // 총점이 같으면 이름의 오름차순으로 정렬
		return s1.getName().compareTo(s2.getName());
	}
}

}

(answer)
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 객체는 List에 저장하여 관리한다.
  • List에 저장된 데이터는 학번의 오름차순으로 정렬할 수 있는 내부 정렬 기준을 구현한다.
  • 그리고, 총점의 역순으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬이 될 수 있는
  • 외부 정렬 기준 클래스를 작성한다.
  • 위 정렬 기준에 맞춰 정렬되는 프로그램을 작성하시오.
  • (단, 등수는 List에 전체 데이터가 추가된 후에 저장되도록 한다.)
    */

public class StudentTest_Answer {
// 등수를 구하는 메서드
public void setRanking(List stuList) {
for (Student2 std1 : stuList) { // 기준 데이터를 구하는 반복문
int rank = 1;

		for (Student2 std2 : stuList) { // 비교 대상을 구하는 반복문
			// 기준보다 비교 대상이 더 크면 rank 값을 증가시킨다.
			if (std1.getTot() < std2.getTot()) {
				rank++;
			}
		}
		// 구해진 등수를 Student객체의 rank 변수에 저장한다.
		std1.setRank(rank);
	}
}

public static void main(String[] args) {

	StudentTest_Answer stdTest = new StudentTest_Answer();
	List<Student2> stdList = new ArrayList<>();

	stdList.add(new Student2(1, "홍길동", 90, 95, 80));
	stdList.add(new Student2(3, "성춘향", 90, 75, 70));
	stdList.add(new Student2(7, "강감찬", 95, 95, 80));
	stdList.add(new Student2(5, "변학도", 80, 95, 90));
	stdList.add(new Student2(2, "일지매", 100, 55, 80));
	stdList.add(new Student2(4, "이순신", 60, 65, 70));
	stdList.add(new Student2(6, "이몽룡", 90, 100, 90));

	// 등수를 구하는 메서드 호출
	stdTest.setRanking(stdList);

	System.out.println("정렬전...");
	for (Student2 std : stdList) {
		System.out.println(std);
	}
	System.out.println();

	// 내부 정렬 기준인 학번의 오름차순으로 정렬하기
	Collections.sort(stdList);

	System.out.println("학번의 오름차순으로 정렬후...");
	for (Student2 std : stdList) {
		System.out.println(std);
	}
	System.out.println();

	// 총점의 역순으로 정렬하기
	Collections.sort(stdList, new sortByTotal());

}

}

class Student2 implements Comparable {
private int num;
private String name;
private int kor;
private int eng;
private int mat;
private int tot;
private int rank;

public Student2(int num, String name, int kor, int eng, int mat) {
	super();
	this.num = num;
	this.name = name;
	this.kor = kor;
	this.eng = eng;
	this.mat = mat;
}

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 getMat() {
	return mat;
}

public void setMat(int mat) {
	this.mat = mat;
}

public int getTot() {
	return tot;
}

public void setTot(int tot) {
	this.tot = tot;
}

public int getRank() {
	return rank;
}

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

@Override
public String toString() {
	return "Student2 [num=" + num + ", name=" + name + ", kor=" + kor
			+ ", eng=" + eng + ", mat=" + mat + ", tot=" + tot + ", rank="
			+ rank + "]";
}

// 학번의 오름차순으로 정렬되는 내부 정렬기준 만들기
@Override
public int compareTo(Student2 std) {
	return Integer.compare(this.getNum(), std.getNum());
}

}

// 총점의 역순으로 정렬하는데 총점이 같으면 이름의 오름차순으로
// 정렬이 될 수 있는 외부 정렬 기준 클래스를 작성한다.
class sortByTotal implements Comparator {

@Override
public int compare(Student2 std1, Student2 std2) {
	if (std1.getTot() == std2.getTot()) {
		return std1.getName().compareTo(std2.getName());
	} else {
		// return Integer.compare(std1.getTot(), std2.getTot()) * - 1;
		return new Integer(std1.getTot()).compareTo(std2.getTot()) * -1;
	}
}

}

좋은 웹페이지 즐겨찾기