Comparator<기준> 는 implements 로 상속받아서 compara() 메소드를 구현해야 한다.
두 개의 매개변수를 비교하여 String s1 , String s2 s1과s2를 비교
TreeSet 생성자에 Comparator 가 구현된 객체를 매개변수로 전달한다.
이미 Comparable 이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의 할수있다.
package collectiontreeset;
import java.util.Comparator;
import java.util.TreeSet;
public class Member implements Comparator<Member> {
// treeSet 을 사용하기 위한 Comparable <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 +" 입니다.";
}
// Set 에서 중복을 방지하려면 MemberID 값이 같으면 true로 리턴 , hashCode도 정의해줘야한다.
@Override
public boolean equals(Object obj) {
Member member = (Member)obj; // 다운캐스팅
if(member.memberID == memberID) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
return memberID;
}
@Override
public int compare(Member member1, Member member2) {
// 첫번째멤버 this , 두번째 멤버 넘어온매개변수 즉, 비교되는 2개 구현
return member1.memberID - member2.memberID;
// 앞에서 뒤에서 뺀 결과가 양수를 반환하는 조건이면 오름차순
// 근데 TreeSet 생성자에다가
// treeSet = new TreeSet<Member>(new Member()); new Member를 적어줘야 한다.
}
}
compare 에 첫번째 멤버 this 와 두번째 멤버 넘어온 매개변수 를 비교한다.
return 값으로 this 멤버변수 - 매개변수 값이 양수가 나오면 오름차순이 나온다
package collectiontreeset;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class MemberTreeSet {
// HashSet 으로 멤버들을 관리해 보기
private TreeSet<Member> treeSet;
public MemberTreeSet() {
treeSet = new TreeSet<Member>(new Member());
// TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달해줘야 한다.
}
//멤버 한명 추가
public void addMember(Member member) { // 멤버가 매개변수로 넘어온다.
treeSet.add(member);
}
// 다른 객체랑 비교하는 구분 Comparable 를 구현해야 한다.
public boolean removeMember(int memberID) {
// 멤버 아이디를 알아야지 해당하는 값을 삭제할수있다.
// 한명한명 봐야하니 Iterator 를 써야한다.
Iterator ir = treeSet.iterator();
if(ir.hasNext()) {
Member 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); // toString 구현된게 호출
}
System.out.println();
}
}
package collectiontreeset;
public class MemberTreeSetTest {
public static void main(String[] args) {
MemberTreeSet manager = new MemberTreeSet();
// TreeSet 회원의 아이디 순서대로 정렬을 하고 싶다면 ?
Member memberLee = new Member(100,"이효리");
Member memberKim = new Member(200,"강감찬");
Member memberPark = new Member(300,"박범");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.showAllMember();
}
}
정렬을 내림차순 으로 하고 싶다면 ?
오름차순은 두개의 매개변수에서 첫자리 자기this변수에서 넘어온 매개변수를 뺐을때 양수가 나오면 됐었다
하지만 내림차순은
s1.compareTo(s2) 에 -1를 곱하면 역순으로 된다.
package collectiontreeset;
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); // -1를 곱하면 역순
// new MyCompare 를 TreeSet<String>(new MyCompare) 이 방식 으로 정렬을 지정할수있다.
}
}
public class ComparatorTest {
public static void main(String[] args) {
MemberTreeSet manager = new MemberTreeSet();
// TreeSet 회원의 아이디 순서대로 정렬을 내림차순 하고 싶다면 ?
TreeSet<String> treeSet = new TreeSet<String>(new MyCompare());
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for(String str : treeSet) {
System.out.println(str);
}
}
}
'JAVA Programming' 카테고리의 다른 글
[69] Map 에서의 HashMap 과 TreeMap (0) | 2020.07.20 |
---|---|
[68] HashSet 으로 관리해보기 (0) | 2020.07.20 |
[66] TreeSet 자료구조로 구현하기 (오름차순,내림차순,중복X) Comparable 상속받을때 (0) | 2020.07.20 |
[65] Set 인터페이스 (Iterator 순회 , 중복x, 순서대로x) (0) | 2020.07.20 |
[63] ArrayList 에서 쓰이는 Stack , Queue구현하기 Static 에서 push() , pop() 구현하기 (0) | 2020.07.20 |