본문 바로가기

개발/Java

Set 인터페이스 <HashSet> , <TreeSet>

반응형
중복되지 않게 자료를 관리하는 Set 인터페이스

HashSet 클래스


  • Set 인터페이스를 구현한 클래스와 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성 파악
  • 동일성 구현을 위해 필요에 따라 equals( ) 메서드와 hashCode( ) 메서드 재정의
  • HashSet은 순서대로 나오지 않음

 

재정의 한 equals( )와 hashCode( ) 메서드 

...

    @Override
	public int hashCode() {
		return memberId;
	}

	@Override
	public boolean equals(Object obj) {
		if( obj instanceof Member){
			Member member = (Member)obj;
			if( this.memberId == member.memberId )
				return true;
			else 
				return false;
		}
		return false;
	}

...

 


 

TreeSet 클래스


  • 객체의 정렬에 사용하는 클래스
  • Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬
  • 내부적으로 이진 검색 트리(binary search tree)로 구현
  • 이진 검색 트리에 저장하기 위해 각 객체를 비교해야 함
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현해야 함.
  • String, Integer 등 JDK의 많은 클래스들이 이미 Comparable을 구현

TreeSet 활용 코드

TreeSet<String> set = new TreeSet<String>();

set.add("홍길동");
set.add("강감찬"); 
set.add("이순신");
		
System.out.println(set);
  • String 클래스는 이미 Comparable 인터페이스가 구현되어 있으므로 오름차순으로 정렬되어 출력
  • binary search tree로 되어있기 때문에 순서는 중요하지 않음
  • 결과 - [강감찬, 이순신, 홍길동]

Comparable 인터페이스 구현

public class Member implements Comparable<Member> {

	private int memberId;
	private String memberName;

_
_생
_략

	@Override
	public int compareTo(Member member) {
    
    	if( this.memberId > member.memberId)
			return 1;
		else if(this.memberId < member.memberId)
			return -1;
		else return 0;
  • 위 코드처럼 Comparable을 구현할 땐 한 개의 매개변수를 받는 compareTo( ) 메서드를 재정의
  • int를 반환 
  • 비교하는 변수가 자신보다 크면 양수, 작으면 음수, 같으면 0을 반환
  • 위는 if문으로 구현

더 간단한 방법

@Override
public int compareTo(Member member) {

	return (this.memberId - member.memberId);
		
}

· 위는 오름차순으로 정렬 방법

return (this.memberId - member.memberId)*(-1);

내림차순으로 해주려면 이렇게 음수로 만들어준다.

 

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) {
		
		Set<String> set = new TreeSet<String>(new MyCompare());
		set.add("aaa");
		set.add("ccc");
		set.add("bbb");
				
		System.out.println(set);
	}
}
  • Comparator 인터페이스는 두 개의 매개변수를 받는 compare( ) 메서드를 재정의한다.
  • TreeSet constructor 안에 comparator 되는 대상을 안에 써줘야 한다.
ex. treeSet = new TreeSet <Member>(new Member( ));

또한 데이터 타입의 default constructor도 만들어 주어야 한다.

 

Comparable을 일방적으로 사용

∴ 이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현 가능

 

 

반응형

'개발 > Java' 카테고리의 다른 글

내부 클래스(inner class)  (0) 2021.05.04
Map 인터페이스 <HashMap> <TreeMap>  (0) 2021.05.04
Iterator  (0) 2021.05.02
Generic 프로그래밍 <T expends 클래스>  (2) 2021.05.01
제네릭(Generic) 프로그래밍 <T>  (0) 2021.05.01