ArrayList를 활용한 정렬 기준 만들기
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;
}
}
}
Author And Source
이 문제에 관하여(ArrayList를 활용한 정렬 기준 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@irisblossom/ArrayList를-활용한-정렬-기준-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)