TreeSet클래스는 객체의 정렬에 사용되는 클래스로 중복을 허용하지 않으면서 객체를 정렬한다.
내부적으로 이진 검색 트리로 구현되어있으며 객체 비교를 위해서 Comparable, Comparator인터페이스를 구현해야한다.
Comparable 인터페이스와 Comparator 인터페이스
Comparable : CompareTo() 메서드를 구현하고 매개변수와 객체 자신(this)를 비교한다.
Comparator : compare() 매서드를 구현하고 두 개의 매개변수를 비교하여 TreeSet 생성장에 Comparator가 구현된 객체를 매개변수로 전달한다.
ex) TreeSet<Member> treeSet = new TreeSet<Member>(new Member());
일반적으로 Comparable 을 더 많이 사용하지만 Comparable 이 이미 구현된 경우 Comparator를 이용하여 다른 정렬방식을 정의 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String agrs[]) {
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("홍길동");
treeSet.add("이순신");
treeSet.add("강감찬");
for(String str : treeSet) { //정렬이 되어서 출력된다
//String에서는 이미 Comparable이 정의 되어있기 때문에
System.out.println(str);
}
}
}
|
cs |
Comparable을 이용한 Member
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
public class Member implements Comparable<Member>{
private int memberId;
private String memberName;
public Member() {}
public Member(int memberId,String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String toString() {
return memberName +"회원님의 아이디는 "+memberId +"입니다.";
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member = (Member)obj;
return(this.memberId == member.memberId);
}
return super.equals(obj);
}
@Override
public int hashCode() {
return memberId;
}
@Override
public int compareTo(Member member) {
//this와 비교 this가 더 컸을 때 양수반환되면 오름차순
//return this.memberId - member.memberId;
return this.memberName.compareTo(member.memberName);
}
}
|
cs |
Comparator을 이용한 Member2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.util.Comparator;
public class Member2 implements Comparator<Member2>{
private int memberId;
private String memberName;
public Member2() {}
public Member2(int memberId,String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String toString() {
return memberName +"회원님의 아이디는 "+memberId +"입니다.";
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member2) {
Member2 member = (Member2)obj;
return(this.memberId == member.memberId);
}
return super.equals(obj);
}
@Override
public int hashCode() {
return memberId;
}
@Override
public int compare(Member2 member1, Member2 member2) { //첫 인자를 this라고 생각
// TODO Auto-generated method stub
return member1.memberId - member2.memberId;
}
}
|
cs |
Comparable을 이용한 멤버를 통해 MemeberTreeSet 클래스를 작성하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class MemberTreeSet {
private TreeSet<Member> treeSet;
public MemberTreeSet() {
treeSet = new TreeSet<Member>();
// 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();
if(member.getMemberId() == memberId) {
treeSet.remove(member);
return true;
}
}
System.out.println(memberId + "번호가 존재하지않습니다.");
return false;
}
public void showAllMember() {
for(Member m : treeSet) {
System.out.println(m);
}
System.out.println();
}
}
|
cs |
MemberTreeSetTest클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class MemberTreeSetTest {
public static void main(String[] args) {
MemberTreeSet manager = new MemberTreeSet();
//회원의 아이디 순서대로 정렬을 해주고싶다면
Member memberLee = new Member(100,"Lee");
Member memberKim = new Member(200,"Kim");
Member memberPark = new Member(300,"Park");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.showAllMember();
manager.removeMember(100);
manager.showAllMember();
}
}
|
cs |
Comparator예제 String은 기본적으로 오름차순으로 정렬해주는 Comparable이 정의되어있기 때문에 내림차순으로 정렬 해주려면 Comparator를 이용해야한다.
새로운 비교를 정의해줄 MyCompare클래스를 작성하고 TreeSet 객체를 생성할 때 new MyCompare()를 통해 사용하겠다고 작성해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.util.Comparator;
import java.util.TreeSet;
class MyCompare implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2) * (-1);
}
}
public class ComparatorTest {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<String>(new MyCompare());
//Comparator 이용을 위해 new MyCompare()를 작성해준다.
treeSet.add("홍길동");
treeSet.add("이순신");
treeSet.add("강감찬");
for(String str : treeSet) {
//내림차순으로 하고싶을떄 String은 이미 Comparable 이 정의되어있기 때문에
//Comparator를 이용해 다시 정의해준다
System.out.println(str);
}
}
}
|
cs |
'IT > Java' 카테고리의 다른 글
내부클래스 (0) | 2020.01.10 |
---|---|
컬렉션 프레임워크 06 Map인터페이스 (0) | 2020.01.09 |
컬렉션 프레임워크 05-1 Set인터페이스 (0) | 2020.01.09 |
컬렉션 프레임워크04-스택,큐 구현 (0) | 2020.01.08 |
컬렉션 프레임워크03 List 인터페이스 (0) | 2020.01.08 |