컴퓨터공학 💻 도서관📚
Part2. 5-14 정렬을 위해 Comparable과 Comparator 인터페이스 구현하기 (TreeSet 클래스) 본문
Part2. 5-14 정렬을 위해 Comparable과 Comparator 인터페이스 구현하기 (TreeSet 클래스)
들판속초록풀 2025. 6. 28. 10:39TreeSet 클래스 활용하기
- 객체의 정렬에 사용하는 클래스
- Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
- 내부적으로 이진검색트리(binary search tree)로 구현됨
- 이진검색트리에 저장하기 위해 각 객체를 비교해야 함
- 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음
- String, Integer등 JDK의 많은 클래스들이 이미 Comparable이 구현되어 있음
- Comparable은 java-lang 패키지 안에 있고 , Comparator은 java-util 패키지 안에 있다.
String 클래스는 이미 Comprable 인터페이스를 구현했기 때문에 문자열이 오름차순으로 정렬되어 출력된다
import java.util.TreeSet;
public class TreeSetTest { // Test 야야야야야야야야야야야야
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<String>(); // String 클래스
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for(String str : treeSet) {
System.out.println(str);
}
}
}
(밑에꺼가 이 강의의 주인공 코드)
import java.util.TreeSet
import java.util.Iterator
public class MemberTreeSet { // Member 클래스 집합 (이 강의에서 이 코드가 주인공임)
private TreeSet<Member> treeSet; // Member 클래스 집합
public MemberTreeSet(){ // 생성자
treeSet = new TreeSet<Member>();
}
/*
public MemberTreeSet(){
treeSet = new TreeSet<Member>( new Member() ); // Comparator 쓸 때 이렇게 해야 함
}
*/
public void addMember(Member member){
treeSet.add(member);
}
public boolean removeMember(int memberId){
Iterator<Member> ir = treeSet.iterator(); // 순회
while( ir.hasNext()){
Member member = ir.next();
int tempId = member.getMemberId();
if( tempId == memberId){
treeSet.remove(member);
return true;
}
}
System.out.println(memberId + "가 존재하지 않습니다");
return false;
}
public void showAllMember(){
for(Member member : treeSet){
System.out.println(member);
}
System.out.println();
}
}
public class MemberTreeSetTest // Test 야야야야야야야야야야야야
public static void main(String[] args) {
MemberTreeSet memberTreeSet = new MemberTreeSet();
Member memberKim = new Member(1003, "김유신");
Member memberLee = new Member(1001, "이순신");
Member memberKang = new Member(1002, "강감찬");
memberTreeSet.addMember(memberKim);
memberTreeSet.addMember(memberLee);
memberTreeSet.addMember(memberKang);
memberTreeSet.showAllMember();
}
}
직접 만든 Member클래스의 아이디가 오름차순으로 정렬되게 하기 위해서는 Comparable 이나 Comparator 인터페이스
둘 중에 하나를 구현해야 한다.
// Comparable 버전
public class Member implements Comparable<Member>{ // Member 클래스
......
@Override
public int compareTo(Member member) { // 반환형이 int ( 빼기로 대소비교 )
return (this.memberId - member.memberId) * (-1); //내림차순
//return (this.memberId - member.memberId); //오름차순
}
}
Comparable은 매개변수가 1개이고(자기자신과 비교하기 때문)
Comparator는 매개변수가 2개이다.(2개의 매개변수를 비교)
Comparator를 쓸 때는 반드시 MemberTreeSet 클래스 생성자 매개변수에 내가 어떤 클래스로 구현을 해놨는지
Comparator 되는 대상을 여기다 써줘야 한다. (위에 주석으로 있음)
treeSet = new TreeSet<Member>( new Member() );
Comparable인 경우는 그냥 구현이 되는데 Comparator인 경우는 TreeSet 생성자 안에 Comparator가 구현된 얘를 지정을 해줘야 한다.
그리고 저 경우는 Member 클래스에 Member() 이 형태의 기본 생성자가 있어야 한다.
// Comparator 버전
public class Member implements Comparator<Member>{ // Member 클래스
......
@Override
public int compare(Member member1, Member member2) { // 매개변수가 2개
// Comparator 은 메서드 이름이 compare
return (member1.memberId - member2.memberId) * (-1); //내림차순
//return (member1.memberId - member2.memberId); //오름차순
}
}
Comparable은 일반적으로 많이 쓰고
Comparator은 언제 쓰냐면
Comparator의 활용 : 이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있다
String 클래스 같은 경우는 JDK 안에서 이미 오름차순으로 정렬하는게 구현되어 있다. (Comparable 이 구현되어 있다)
그런데 나는 지금 이 상태에서 String을 내림차순으로 구현하고 싶다고 하면 바꿀 수 있다.
MyCompare 라는 걸 하나 만들고 Comparator로 구현을 한다
-1을 곱해서 오름차순을 내림차순으로 바꿔버린다.
그리고 String에 대한 TreeSet을 선언할 때 Compare 하는 인자를 MyCompare을 줘버린다.
그러면 String이 Compare이 아니라 Comparator가 구현된 이 클래스에 의해서 비교가 된다.
이렇게 쓸 수 있다.
class MyCompare implements Comparator<String>{ // Comparator
@Override
public int compare(String s1, String s2) { // 매개변수가 2개
return (s1.compareTo(s2)) *-1 ; // -1을 곱해서 양수가 음수가 되고 음수가 양수가 된다.
}
}
public class ComparatorTest {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>(new MyCompare()); // 인자를 MyCompare을 줘버리기
set.add("aaa");
set.add("ccc");
set.add("bbb");
System.out.println(set);
}
}
'✅🌲강의 복습 노트 > 패캠 JavaSpring 강의,코드 복습' 카테고리의 다른 글
Part2. 6-1 여러 내부 클래스의 정의와 유형 (1) | 2025.07.06 |
---|---|
Part2. 5-15 쌍(pair)으로 자료를 관리하는 Map 인터페이스를 구현한 클래스와 그 활용 (HashMap 클래스 , TreeMap 클래스) (0) | 2025.07.03 |
Part2. 5-13 중복되지 않게 자료를 관리하는 Set 인터페이스를 구현한 클래스와 그 활용 (HashSet 클래스) (0) | 2025.06.28 |
Part2. 5-12 Collection 요소를 순회하는 Iterator (0) | 2025.06.27 |
Part2. 5-11 순차적으로 자료를 관리하는 List 인터페이스를 구현한 클래스와 그 활용 (ArrayList 클래스 활용) (0) | 2025.06.27 |