본문 바로가기
IT/Java

컬렉션 프레임워크 05-2 Set인터페이스(TreeSet)

by 어센트 2020. 1. 9.

TreeSet클래스는 객체의 정렬에 사용되는 클래스로 중복을 허용하지 않으면서 객체를 정렬한다.

내부적으로 이진 검색 트리로 구현되어있으며 객체 비교를 위해서 Comparable, Comparator인터페이스를 구현해야한다.

 

Comparable 인터페이스와  Comparator 인터페이스

Comparable : CompareTo() 메서드를 구현하고 매개변수와 객체 자신(this)를 비교한다.

Comparator : compare() 매서드를 구현하고 두 개의 매개변수를 비교하여 TreeSet 생성장에  Comparator가 구현된 객체를 매개변수로 전달한다.

ex) TreeSet<Member> treeSet = new TreeSet<Member>(new Member());

 

일반적으로 Comparable 을 더 많이 사용하지만  Comparable 이 이미 구현된 경우  Comparator를 이용하여 다른 정렬방식을 정의 할 수 있다.

 

 

 

String을 활용한 TreeSet 예제
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

내림차순으로 출력된 모습