문제
아래 2개의 클래스파일을 작성하고, 메인에서 아래와 같은 실행결과가 나오도록 코딩하시오.
Student클래스(정렬대상이 될 클래스)
멤버변수
private String name
private int score
멤버함수
public int compareTo () *재정의(정렬기준)
getter()구현
TreeSetExample(실행클래스)
실행화면
아래와 같이 8개의 Student객체를 treeSet에 저장
treeSet.add(new Student8("신은혁", 96));
treeSet.add(new Student8("김주성", 86));
treeSet.add(new Student8("김동주", 68));
treeSet.add(new Student8("이대호", 100));
treeSet.add(new Student8("김호주", 59));
treeSet.add(new Student8("이주희", 77));
TreeSet은 자동 정렬(오름차순)이 되는데 사용자 정의 클래스인 Student 클래스를 아래와 같이 나오도록 코딩하고, 아울러 출력 시 반복자를 이용하여 전체 리스트 출력 후, 최고 점수와 학생 이름을 출력하세요.
결과
전체 학생 리스트입니다.
학생 이름 : 김호주 , 점수 59
학생 이름 : 김동주 , 점수 68
학생 이름 : 이주희 , 점수 77
학생 이름 : 김주성 , 점수 86
학생 이름 : 신은혁 , 점수 96
학생 이름 : 이대호 , 점수 100
implements Comparable를 활용한 코드
import java.util.Iterator;
import java.util.TreeSet;
class Student8 implements Comparable<Student8> {
private String name;
private int score;
public Student8(String name, int score) {
this.name = name;
this.score = score;
}
public int compareTo(Student8 student) {
/*
* if (this.score > student.score) { return 1; } else if (this.score ==
* student.score) { return 0; } else return -1;
*/
return Integer.compare(this.score, student.score);
}
/*
* public String toString() { return "학생 이름 : " + name + ", 점수 : " + "(" + score
* + ")"; //객체 하나하나가 toString으로 불림 }
*/
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
public class TreeSetExample1 {
public static void main(String[] args) {
TreeSet<Student8> treeSet = new TreeSet<>();
treeSet.add(new Student8("신은혁", 96));
treeSet.add(new Student8("김주성", 86));
treeSet.add(new Student8("김동주", 68));
treeSet.add(new Student8("이대호", 100));
treeSet.add(new Student8("김호주", 59));
treeSet.add(new Student8("이주희", 77));
//System.out.println(treeSet);
System.out.println("전체 학생 리스트입니다.");
Iterator<Student8> it = treeSet.iterator();
while (it.hasNext()) {
Student8 stu = it.next();
System.out.println("학생 이름 : " + stu.getName() + " , " + "점수 " + stu.getScore());
}
}
}
Comparator를 활용한 코드
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class ScoreComparator implements Comparator<Student8> {
public int compare(Student8 s1, Student8 s2) {
if (s1.getScore() > s2.getScore())
return 1;
else if (s1.getScore() == s2.getScore())
return 0;
else
return -1;
// return Integer.compare(s1.getScore(), s2.getScore());
}
}
class Student8 {
private String name;
private int score;
public Student8(String name, int score) {
this.name = name;
this.score = score;
}
/*
* public String toString() { return "학생 이름 : " + name + ", 점수 : " + "(" + score
* + ")"; //객체 하나하나가 toString으로 불림 }
*/
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
public class TreeSetExample1 {
public static void main(String[] args) {
TreeSet<Student8> treeSet = new TreeSet<>(new ScoreComparator());
treeSet.add(new Student8("신은혁", 96));
treeSet.add(new Student8("김주성", 86));
treeSet.add(new Student8("김동주", 68));
treeSet.add(new Student8("이대호", 100));
treeSet.add(new Student8("김호주", 59));
treeSet.add(new Student8("이주희", 77));
// System.out.println(treeSet);
System.out.println("전체 학생 리스트입니다.");
Iterator<Student8> it = treeSet.iterator();
while (it.hasNext()) {
Student8 stu = it.next();
System.out.println("학생 이름 : " + stu.getName() + " , " + "점수 " + stu.getScore());
}
}
}
보통 이미 Comparable이 구현돼있을 경우, Comparator로 정렬 기준을 바꿔주는 것 같다.
참고
https://velog.io/@dnrwhddk1/JAVA-TreeSetComparable-Comparator
[JAVA] TreeSet(Comparable, Comparator)
자바의 TreeSet에 대해 알아보자!
velog.io
챗 GPT 질문
System.out.println(treeSet); 이거 부르면 객체 하나하나가 toString이 불리는 거지?
답변
맞습니다. System.out.println(treeSet)을 호출하면 treeSet에 포함된 각 Student8 객체에 대해 toString() 메서드가 자동으로 호출됩니다. 이렇게 기본적으로 자동으로 호출되는 toString() 메서드를 통해 객체의 내용을 문자열로 표현할 수 있습니다.
즉, System.out.println(treeSet)은 내부적으로 treeSet에 있는 각 Student8 객체에 대해 toString() 메서드를 호출하고 그 결과를 화면에 출력합니다. 따라서 출력 결과로는 "학생 이름 : xxx, 점수 : (xxx)"와 같이 각 학생의 정보가 출력됩니다.
CompareTo 동작 방식
TreeSet에 요소를 추가하면 compareTo 메서드가 호출됩니다.
TreeSet은 정렬된 컬렉션이며 compareTo 메서드를 사용하여 세트의 요소 순서를 결정합니다. TreeSet에 요소를 추가하면 내부적으로 compareTo 메소드를 사용하여 새 요소를 세트의 기존 요소와 비교합니다. 비교 결과에 따라 정렬된 순서에서 새 요소를 어디에 배치할지 결정합니다.
작동 방식은 다음과 같습니다.
- add 메소드를 사용하여 TreeSet에 새 요소를 추가합니다.
- add 메소드는 내부적으로 새 요소의 compareTo 메소드를 호출하여 세트의 기존 요소와 비교합니다.
- compareTo 메소드에서 반환된 비교 결과에 따라 새 요소가 집합의 적절한 위치에 삽입되어 정렬된 순서를 유지합니다.
따라서 TreeSet에 요소를 추가할 때 compareTo 메소드는 세트 내 요소의 순서를 결정하는 데 중요한 역할을 합니다.
전에는 Hashset에 대해 배운 적이 있는데 TreeSet 과의 차이점은 뭘까?
- Set 이란 순서가 없는 집합체이며, 중복을 허용하지 않는다.
- TreeSet은 HashSet과 다르게 그 값이 정렬되어 저장이 되지만, 그렇기 때문에 HashSet보다 속도가 느리다.
'Java' 카테고리의 다른 글
| 이클립스 초기 화면으로 돌리는 법 (perspective 화면 초기화) (0) | 2023.09.27 |
|---|---|
| [Java] HashMap 활용한 전화번호부 예제 (24-1) (0) | 2023.09.14 |
| [Java] Map 사용 예제 (23-2) (0) | 2023.09.14 |
| [Java] Map 사용 예제 (23-1) (0) | 2023.09.14 |
| [Java] ArrayList 사용 예제 (22-2) (0) | 2023.09.13 |