Super Coding Addict
Ch11. 컬렉션 프레임워크 (5) 본문
* TreeSet 클래스
- Tree~ : 객체 정렬에 사용되는 클래스
- 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬
- 예제
# TreeSetTest 클래스
package ch11.treeset;
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은 이미 Comparable을 구현해 놓았기 때문에 출력을 해보면 오름차순으로 정렬이 잘 되어있음을 볼 수 있다
- 예제 : MemberTreeSet
# Member 클래스
package ch11.treeset;
public class 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 int hashCode() {
return memberId;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member = (Member)obj;
return (this.memberId == member.memberId);
}
return false;
}
}
# MemberTreeSet 클래스
package ch11.treeset;
import java.util.Iterator;
import java.util.TreeSet;
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();
if(member.getMemberId() == 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();
}
}
# MemberTreeSetTest 클래스 (메인)
package ch11.treeset;
import java.util.Iterator;
import java.util.TreeSet;
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();
if(member.getMemberId() == 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();
}
}
--> run을 해보면 다음과 같이 Comparable할 수 없다는 에러가 떨어진다
--> 숫자의 비교 등은 잘 되지만, 다른 객체의 경우 '비교하는 방법'을 구현해야함 !!
1) Comparable 구현하기
@Override
public int compareTo(Member member) {
return (this.memberId - member.memberId); //양수반환 -> 오름차순 정렬
}
--> compareTo() 메서드를 오버라이드한다
--> 매개변수와 객체자신(this)를 비교
--> 이 때 양수를 반환하면 오름차순 정렬이 된다 (결과값에 -1을 곱해주면 음수가 반환되면서 내림차순으로 정렬됨)
--> memberId가 아니라, memberName으로 정렬하고 싶다면,
@Override
public int compareTo(Member member) {
return this.memberName.compareTo(member.getMemberName());
}
2) Comparator로 구현하기
@Override
public int compare(Member member1, Member member2) {
return (member1.memberId - member2.memberId);
}
--> Comparator를 구현하면, compare()메서드를 오버라이딩한다
--> 두 개의 매개 변수를 비교
--> 주의할 점은, Comparable과 달리 Comparator를 구현하는 경우 TreeSet클래스에서 TreeSet객체 생성자 인자로 Member객체 기본생성자를 넣어주어야 한다!
--> 'Member클래스에 정의된 compare방식으로 정렬하라'는 의미
- 일반적으로 Comparable을 더 많이 사용
- 그러나 이미 Comparable을 구현한 경우, Comparator를 이용하여 다른 정렬방식을 정의할 수 있다
- 예제
# ComparatorTest 클래스
package ch11.treeset;
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());
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for(String str : treeSet) {
System.out.println(str);
}
}
}
--> String은 오름차순으로 Comparable을 구현하게 되어있음
--> 이 상태에서 String을 내림차순으로 Comparator를 구현하기 위해 MyCompare 클래스를 선언하고 Comparator를 구현
--> s1.compareTo(s2)를 반환하면 오름차순 정렬이나 -1을 곱해 반환하면 내림차순 정렬이 됨
--> main에서 TreeSet 객체 생성시 생성자 인자로 myCompare클래스 기본생성자를 넣어주면, myCompare클래스가 구현한 비교방식을 쓰라는 의미
'JAVA 문법' 카테고리의 다른 글
Ch12. 내부 클래스(1) (0) | 2021.02.27 |
---|---|
Ch11. 컬렉션 프레임워크 (6) (0) | 2021.02.27 |
Ch11. 컬렉션 프레임워크 (4) (0) | 2021.02.24 |
Ch11. 컬렉션 프레임워크 (3) (0) | 2021.02.22 |
Ch11. 컬렉션 프레임워크 (2) (0) | 2021.02.22 |