티스토리 뷰
Goal
- Set 인터페이스에 대해 알아본다
- HashSet 클래스에 대해 알아본다
- TreeSet 클래스에 대해 알아본다.
1. Set 인터페이스
- Collection 하위의 인터페이스
- 중복을 허용하지 않음
- List는 순서기반의 인터페이스지만, Set은 순서가 없음(TreeSet클래스는 순서 존재).
- get(i) 메서드가 제공되지 않음 (Iterator로 순회)
- 저장된 순서와 출력순서는 다를 수 있음.
- 아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용
- HashSet, TreeSet 클래스
1-1 Set은 중복을 허용하지 않는다.
- Set을 사용할 때는 중복을 허용하지 않기 위해, 관리할 Object가 논리적으로 같다는 것을 구현해 놓아야 한다 (equals() and HashCode()), 그렇지 않으면, 중복된 값이 Set에 담길 수 있다.
1-2 Iterator로 순회하기
- 순서대로 저장되지 않는 set인터페이스의 특성상, Iterator객체를 통해 반복을 수행한다.
- Collection의 개체를 순회하는 인터페이스
1) iterator() 메서드 호출
Iterator ir = memberArrayList.iterator();
2. HashSet 클래스
- Set 인터페이스를 구현한 클래스
- 중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode() 메서드를 재정의 해야 함.
2-1 HashSet으로 맴버 관리하기
3. TreeSet 클래스
- 객체의 정렬에 사용되는 클래스
- 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬 함
- 내부적으로 이진 검색 트리(binary search tree)로 구현되어 있음
- 이진 검색 트리에 자료가 저장 될 때 비교하여 저장될 위치를 정함
- 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현 해야 함.
3-1 Comparable 인터페이스와 Comparator 인터페이스
- 정렬 대상이 되는 클래스(member)가 구현해야 하는 인터페이스
- Comparable은 compareTo() 메서드를 구현하고, 매개 변수와 객체 자신(this)를 비교함.
1) compareTo 구현 예시 코드
public int compareTo(Member member) {
return (this.memberId - member.memberId);
}
- Comparator는 compare() 메서드를 구현하고, 두 개의 매개 변수를 비교함.
2) compare 구현 예시 코드
//첫번째 매개변수가 this, 두 번째 매개변수가 넘어온 member값
public int compare(Member member1, Member member2) {
return (member1.memberId - member2.memberId); //오름차순으로 정렬
}
- Comparator는 TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달해야 최종적으로 사용 가능.
3) Comparator가 구현된 Member객체를 TreeSet에 주입.
public MemberTreeSet() {
treeSet = new TreeSet<Member>(new Member());
// TreeSet의 생성자에 Member default constructor(new Member())를 적용하여, 정렬의 기준을 주입함.
}
- 일반적으로 Comparable을 더 많이 사용함.
- 이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음.
4) String을 TreeSet으로 기본 정렬
- 출력결과는 "강감찬" -> "이순신" -> "홍길동"
- String에 기본적으로 Comparable인터페이스가 구현되어 있기 때문에 값을 오름차순으로 정렬함.
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
/*String에 Comparable인터페이스가 구현되어 있기 때문에
* 값들이 기본적을 오름차순으로 정렬되어 출력됨.
*/
for (String str : treeSet) {
System.out.println(str);
}
}
}
5) Comparator를 새롭게 정의하여 다른 정렬 방식 적용하기
- MyCompare클래스를 통해 Comparator를 정의하고, TreeSet 생성자에 Comparator가 정의된 MyCompare클래스를 주입하면, Comparator가 Comparable보다 우선시 되어, Comparator에서 정의한 정렬 방식으로 값이 정렬됨
- MyCompare에서는 내림차순 방식으로 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) {
TreeSet<String> treeSet = new TreeSet<String>(new MyCompare());
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for (String str : treeSet) {
System.out.println(str);
}
}
}
- Comparable<Object>
1) 자료정리를 원하는 객체 타입에 Comparable적용
public class Member implements Comparable<Member> {
2) 원하는 방식으로 직접 compareTo메서드 정의
//this와 넘어온 member의 맴버변수를 비교한다.
@Override
public int compareTo(Member member) {
return (this.memberId - member.memberId); //양수이면 오름차순 정렬
// return (this.memberId = member.memberId) * (-1); 내림 차순 정렬
// return this.memberName.compareTo(member.getMemberName()); 문자열 오름차순 정렬
}
- Comparator<Object>
1) 자료정리를 원하는 객체 타입에 Comparator 적용
public class Member implements Comparator<Member> {
2) 원하는 방식으로 직접 compare메서드 정의
//첫번째 매개변수가 this, 두 번째 매개변수가 넘어온 member값
public int compare(Member member1, Member member2) {
return (member1.memberId - member2.memberId); //오름차순으로 정렬
}
3) Comparator가 구현된 Member객체를 TreeSet에 주입.
public MemberTreeSet() {
treeSet = new TreeSet<Member>(new Member());
// TreeSet의 생성자에 Member default constructor(new Member())를 적용하여, 정렬의 기준을 주입함.
}
'Java > Java 올인원 패키지' 카테고리의 다른 글
28. 람다식 (Java) (0) | 2020.03.23 |
---|---|
27. 내부 클래스 (Java) (0) | 2020.03.21 |
24. List 인터페이스 (Java) (0) | 2020.03.19 |
23. 컬렉션 프레임워크 (Java) (0) | 2020.03.19 |
22. 제네릭 (Java) (0) | 2020.03.19 |
- 20200319
- 20200502
- 20200330
- 20200420
- 20200512
- 백준
- 20200428
- 20200624
- 20200417
- chapter7
- 20200510
- 20200403
- 20200406
- 20200413
- 20200421
- 20200504
- 20200622
- 20201204
- 20200503
- 20200429
- 20200427
- 20200804
- 20200317
- likelion
- 20200425
- 20200415
- chapter8
- 생활코딩리눅스
- 20200423
- 20200424
- Total
- Today
- Yesterday