객체의 정렬
에 사용하는 클래스각 객체를 비교
해야 함Comparable
이나 Comparator
인터페이스를 구현 해야 TreeSet에 추가 될 수 있음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 값 서로 바꾸기
이미 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가 없다면 오름 차순으로 정렬됨