[Java] TreeSet

SeongWon Oh·2021년 8월 20일
0

Java

목록 보기
28/39
post-thumbnail

TreeSet

  • set interface를 구현한 컬렉션 클래스로서 데이터의 중복 저장을 허용하지 않으며 저장 순서 유지를 하지 않는다는 특징이 있다.

  • TreeSet은 객체의 정렬에 사용하는 클래스로 내부적으로 Binary Search Tree를 구현하여 정렬을 한다.

  • HashSet의 경우 Key값이 중복되는 지를 체크만 하였지만 TreeSet은 중복 체크를 하고 동일하지 않은 경우 정렬을 하기 위해 어디로 들어갈지 알아내도록 구현해야한다.

  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 하여 값 비교를 한다.

  • String, Integer등 JDK의 많은 클래스들이 이미 Comparable을 구현되어 있다.


👨🏻‍💻 Example Code1

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이 구현되어 있어서 따로 구현을 하지 않아도 정렬이 된다.


👨🏻‍💻 Example Code2

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();
        
        .....
        
    }
}

👨🏻‍💻 Example Code3

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());
	}
    ...
}

👨🏻‍💻 Example Code4

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);
	}
}



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글