반응형
중복되지 않게 자료를 관리하는 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 |