[JAVA] TreeSet(Comparable, Comparator)

WOOK JONG KIM·2022년 9월 14일
0

패캠_java&Spring

목록 보기
17/103
post-thumbnail

TreeSet

  • 객체의 정렬에 사용하는 클래스
  • Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
  • 내부적으로 이진검색트리(binary search tree)로 구현됨
  • 이진검색트리에 저장하기 위해 각 객체를 비교해야 함
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음
  • String, Integer등 JDK의 많은 클래스들이 이미 Comparable을 구현했음
package ch13;

import java.util.TreeSet;
import java.util.Iterator;

import ch10.Member;

public class MemberTreeSet {
private TreeSet<Member> TreeSet;
	
	public MemberTreeSet() {
		TreeSet = new TreeSet<Member>();
	}
	
	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();
	}
	
}
import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {

		TreeSet<String> treeSet = new TreeSet<String>();
		treeSet.add("홍길동");
		treeSet.add("강감찬");
		treeSet.add("이순신");
		
		for(String str : treeSet) {
			System.out.println(str);
		}
	}
}

String 클래스는 이미 Comprable 인터페이스가 구현되어 있으므로 오름차순으로 정렬되어 출력됨

public class MemberTreeSetTest {

	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 인터페이스를 구현

public class Member implements Comparable<Member>{

	......

	@Override
	public int compareTo(Member member) {
		/*
        if(this.memberId > member.memberId)
		return 1;
		else if(this.memberId < memberId)
		return -1;
		Else return 0; 
        */

		//return (this.memberId - member.memberId);   //오름차순
		return (this.memberId - member.memberId) *  (-1);   //내림 차순
	}
}

compareTo(Member member)

-> 인자 하나만 넘어옴

기존의 트리를 구성하고 있는 요소가 member에 하나씩 호출 되면서 비교

바이너리 트리라 다 비교는 X

내가 더 큰경우 양수 아니면 음수 같으면 0

이러한 반환값에 의해서 다른 값들과 비교

inorder 트레버스를 기준으로 루트 노드 값보다 크면 양수 이면서 오른쪽

inorder 트레버스를 기준으로 루트 노드 값보다 작으면 음수 이면서 왼쪽

왼쪽에 있는 값이 먼저 출력된 후 -> 중앙 -> 오른쪽 순서

내림 차순으로 출력 하고자 한다면 큰값들을 왼쪽으로 보내면 되겠지?
-> return 1 과 -1 값 서로 바꾸기


Comparator 활용

이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있음

class Member implements Comparator<Member>{


...
public Member(){} -> 생성자 만들어 줘야함

/*comparable과 다르게 매개변수로 인자 두개를 받고 비교 */

@Override
	public int compare(Member member1, Member member2) {
		return (member1.memberId - member2.memberId) ;
	}
}

// 이 방식을 쓰려면
public MemberTreeSet() {
		TreeSet = new TreeSet<Member>(new Member());
	}

-> // TreeSet 생성자 안에 Comparator가 구현된 애를 지정해줘야함
// new Member로() comparator가 구현되어 있으니 이것의 compare 함수를 불러서
// 비교하라는 뜻
class MyCompare implements Comparator<String>{

	@Override
	public int compare(String s1, String s2) {
        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);
	}
}

// MyCompare가 없다면 오름 차순으로 정렬됨
profile
Journey for Backend Developer

0개의 댓글