JAVA

Comparable 인터페이스와 Comparator 인터페이스

Stater 2019. 10. 11. 09:00

Comparable 인터페이스와 Comparator 인터페이스

- 정렬 대상이 되는 클래스가 구현해야하는 인터페이스

- Comparable은 compareTo() 메서드를 구현

  매개변수와 객체 자신(this)를 비교

 

- Comparator는 compare() 메서드를 구현

  두개의 매개 변수를 비교 

  TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달

TreeSet<Member> treeSet = new TreeSet<Member>(new Member());

- 일반적으로 Comparable을 더 많이 사용

- 이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의 할 수 있다.

============
Member class
============
package treeset;

import java.util.Comparator;

//public class Member implements Comparable<Member> {
public class Member implements Comparator<Member> {
	
	private int memberId;
	private String memeberName;
	
	public Member() {}
	@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;
	}
	public Member(int memberId,String memberName) {
		this.memberId=memberId;
		this.memeberName=memberName;
	}
	public int getMemberId() {
		return memberId;
	}
	public void setMemberId(int memberId) {
		this.memberId = memberId;
	}
	public String getMemeberName() {
		return memeberName;
	}
	public void setMemeberName(String memeberName) {
		this.memeberName = memeberName;
	}
	
	public String toString() {
		return memeberName +"회원님의 아이디는 "+memberId+"입니다.";
	}
//	@Override
//	public int compareTo(Member member) {
//		
////		return (this.memberId - member.memberId);
////		return (this.memberId - member.memberId)*(-1);
//		return this.memeberName.compareTo(member.getMemeberName());//이름순으로
//	}
	@Override
	public int compare(Member member1, Member member2) {
		// TODO Auto-generated method stub
		return (member1.memberId-member2.memberId);
	}
	
	

}
============
Treeset class
============
package treeset;


import java.util.Iterator;
import java.util.TreeSet;
//HashSet을 통한 Member관리 
public class MemberTreeSet {
	
	private TreeSet<Member> treeSet;

	public MemberTreeSet() {
		//Comparable으로 정렬할경우
		//treeSet = new TreeSet<Member>();
		//comparator로 정렬할경우 
		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();
	}
}

 

================
treesettest class
================
package 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);
		
		//회원에 아이디 별로 정렬
		//처음에는 정렬이 안된다-> 그이유는 정렬에대한 기준이 설정되어 있지 않으므로.
		//멤버클래스에 Comparable<Member> 추가해줘서 기준을 값들을 코딩 한 후 실행하면 
		//정상적으로 정렬이 이뤄진다.아래와 같이 정렬
		//	@Override
		//		public int compareTo(Member member) {
		//			
		//			return (this.memberId - member.memberId); 100,200,300
		//			return (this.memberId - member.memberId)*(-1); 300,200,100
		//			return this.memeberName.compareTo(member.getMemeberName());//이름순으로
		//		}
		manager.showAllMember();

		
		

	}

}

 

Comparator을 사용하여 다른 방식으로 정렬하고 싶은 경우에 아래와 같이하면된다.

생성자를 정렬하는 곳에 넣어서 사용.

 

package treeset;

import java.util.Comparator;
import java.util.TreeSet;


//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) {
		//(new MyCompare()을 재정의 한후<String>()괄호 안에 넣어서 사용한다.
		TreeSet<String> treeSet = new TreeSet<String>(new MyCompare());
		treeSet.add("홍길동");
		treeSet.add("강감찬");
		treeSet.add("이순신");
		
		for(String str:treeSet) {
			
			System.out.println(str);
		}

	}

}

 

반응형

'JAVA' 카테고리의 다른 글

내부클래스  (0) 2019.10.13
Map인터페이스  (2) 2019.10.12
set 인터페이스  (0) 2019.10.10
Stack과 Queue  (0) 2019.10.09
List 인터페이스  (0) 2019.10.08