set interface를 구현한 컬렉션 클래스로서 데이터의 중복 저장을 허용하지 않으며 저장 순서 유지를 하지 않는다는 특징이 있다.
TreeSet은 객체의 정렬에 사용하는 클래스로 내부적으로 Binary Search Tree를 구현하여 정렬을 한다.
HashSet의 경우 Key값이 중복되는 지를 체크만 하였지만 TreeSet은 중복 체크를 하고 동일하지 않은 경우 정렬을 하기 위해 어디로 들어갈지 알아내도록 구현해야한다.
비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 하여 값 비교를 한다.
String, Integer등 JDK의 많은 클래스들이 이미 Comparable을 구현되어 있다.
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<String> set = new TreeSet<>();
set.add("홍길동");
set.add("강감찬");
set.add("이순신");
System.out.println(set);
// Result: [강감찬, 이순신, 홍길동]
}
}
String에는 이미 Comaprable이 구현되어 있어서 따로 구현을 하지 않아도 정렬이 된다.
Comparable 사용 예시
Member.java
public class Member implements Comparable<Member>{
// Member를 comparable할 인터페이스를 구현
......
//TreeSet에서 필수적인 Comparable method
// CompareTo는 매개변수가 하나로 자기 자신이 들어간다.
@Override
public int compareTo(Member member) {
// 나보다 크면 양수, 작으면 음수, 같으면 0을 return
// TreeSet은 compareTo에서 return해주는
// 양수 음수 0을 기반으로 값을 비교하고 정렬을 하게 된다.
if (this.memberId > member.memberId)
return 1;
else if(this.memberId < member.memberId)
return -1;
else return 0;
}
MemberTreeSetTest.java
public class MemberTreeSetTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MemberTreeSet memberTreeSet = new MemberTreeSet();
.....
}
}
Comparator 사용 예시
Member.java
public class Member implements Comparator<Member>{
......
// Comparator의 compare는 매개변수가 2개로 하나는 자기 자신이고 다른 하나는 비교대상이다.
@Override
public int compare(Member member1, Member member2) {
return (member1.memberId -member2.memberId);
}
MemberTreeSet.java
import java.util.TreeSet;
import java.util.Iterator;
public class MemberTreeSet {
// member를 treeSet로 관리하기 위해 만든 class
private TreeSet<Member> treeSet;
public MemberTreeSet() {
// comparator를 사용할때는 반드시 괄호 안에 comparator가 구현된 것을 써줘야한다.
treeSet = new TreeSet<>(new Member());
}
...
}
Comparator 사용 예시2
이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있다.
package ch13_2;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class MyCompare implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
// String은 JDK에서 compareTo가 구현되어 있어서 그것을 사용
return (s1.compareTo(s2)) *-1 ;
// -1을 곱해주면 순서가 역으로 바뀐다.
}
}
public class ComparatorTest {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>(new MyCompare());
set.add("aaa");
set.add("ccc");
set.add("bbb");
System.out.println(set);
}
}