Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch11. 컬렉션 프레임워크 (5) 본문

JAVA 문법

Ch11. 컬렉션 프레임워크 (5)

밍응애 2021. 2. 25. 23:59

* 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