Iterator ir=memberArrayList.iterator();
아래와 같이 Member클래스와 다르게 중복된 값이 나오게 되는데 그 이유는 Member클래스가 논리적으로 구현되지 않았기 때문이다.
Member클래스에서 논리적으로 구현하기 위해 equals와 hashcode를 재정의해보자.
그 결과 중복하지 않은 값을 출력하게 됨
Member.class
package collection.treeset;
import java.util.Comparator;
public class Member implements Comparator<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+"입니다.";
}
//HashSet의 결과를 출력할 때 중복되지 않은 값을 허용하게 하려면 hashcode와 equals를 재정의해야한다.
@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;
}
//숫자로는 숫자끼리 구현이 되지만 다른객체와의 비교는 구현해야함
//this객체와 넘어온 매개변수와 비교
//이름을 오름차순으로 정렬함
/* @Override
public int compareTo(Member member) {
return this.memberName.compareTo(member.getMemberName());
}
*/
//member1이 this객체, member2가 넘어온 매개변수
//아이디를 오름차순으로 정렬함
@Override
public int compare(Member member1, Member member2) {
// TODO Auto-generated method stub
return (member1.memberId - member2.memberId);
}
}
MemberTreeSet.class
package collection.treeset;
import java.util.Iterator;
import java.util.TreeSet;
//TreeSet으로 멤버관리하기
public class MemberTreeSet {
private TreeSet<Member> treeSet;
public MemberTreeSet() {
//comparator할땐 TreeSet의 생성자에 new Member()추가해줘야함
treeSet=new TreeSet<Member>(new 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.class
package collection.treeset;
public class MemberTreeSetTest {
public static void main(String[] args) {
MemberTreeSet manager=new MemberTreeSet();
Member memberLee= new Member(300,"Lee");
Member memberKim= new Member(100,"Kim");
Member memberPark= new Member(200,"Park");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.showAllMember();
}
}
TreeSet treeSet= New TreeSet(new Member());
ComparatorTest.class
package collection.treeset;
import java.util.Comparator;
import java.util.TreeSet;
//이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음
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) {
//원래 String방식의 compareTo메서드를 호출하는 것이 아닌 Comparator방식으로 호출함
TreeSet<String> treeSet=new TreeSet<String>(new MyCompare());
treeSet.add("홍길동");
treeSet.add("김강찬");
treeSet.add("이순신");
for(String str : treeSet) {
System.out.println(str);
}
}
}