복습!
- Set인터페이스는 Collection인터페이스를 상속받음
- 순서없고, 중복불가(같이 Collection을 상속받은 List는 순서있고, 중복 가능)
1. HashSet
- Set 인터페이스를 구현한 대표적인 컬렉션 클래스
- 객체를 저장하기전에 기존에 같은 객체가 있는지 확인(중복 객체 삭제)
Set set = new HashSet();
for(int i=0; i < objArr.length; i++) {
Boolean setCheck = set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장
System.out.println(objArr[i]+"="+setCheck);
}
// HashSet에 저장된 요소 출력
System.out.println(set); // 결과: [1, 1, 2, 3, 4] <- add 메서드는 객체를 추가할 때 HashSet에 같은 객체가 존재하면 중복으로 간주하고 저장하지 않고 작업이 실패했다고 false를 반환함,1이 두 번 출력된 것은 하나는 String, 하나는Integer 이기 때문임
// Set은 순서가 없기 때문에 저장한 순서와 다르게 출력될 수 있음, 이것은 1이 위에서 넣은대로 String, Integer 순서가 아닐 수 있다는 것을 의미하며 중복제거와 순서를 유지하고 싶다면 LinkedHashSet을 사용할 것
// HashSet에 저장된 요소들을 출력한다.(Iterator이용)
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
- HashSet의 boolean add(Object o )메서드는 저장할 객체의 equals()와 hashCode()를 호출해서 중복 판단을 하기 때문에 equals()와 hashCode()를 오버라이딩해야함
HashSet set = new HashSet();
set.add("abc");
set.add("abc"); // 중복 저장X
set.add(new Person("David",10));
set.add(new Person("David",10)); // 중복 저장O
System.out.println(set);
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
HashSet set = new HashSet();
set.add("abc");
set.add("abc"); // 중복 저장X
set.add(new Person("David",10));
set.add(new Person("David",10)); // 중복 저장O
System.out.println(set);
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
// equals()와 hashCodde()를 오버라이딩해야 HashSet이 바르게 동작
// 메뉴 -> Source -> Generate hashCode(0 and equals()... -> 선택 ->Generate 클릭하여 생성
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
return age == other.age && Objects.equals(name, other.name);
}
public String toString() {
return name +":"+ age;
}
}
2. LinkedSet
- 순서를 유지하려면 LinkedHashSet클래스 사용하면 됨
3.TreeSet
- 범위 검색과 정렬의 유리한 컬렉션 클래스
- TreeSet에 저장되는 객체가 Comparable을 구현하던지 Comparator를 제공하여 비교 방법을 정해야함(정하지 않을 시 예외발생)
- 이진 탐색 트리(binary search tree) 자료구조 형태로 데이터 저장
- 값 저장 시 정렬됨
1) 이진 탐색 트리(binary search tree)
- 부모 노드의 왼쪽은 부모 노드 값보다 작은 값의 자식 노드, 오른쪽은 부모 노드 값보다 큰 값의 자식 노드를 저장하는 이진트리
- 모든 노드는 최대 두개의 자식 노드를 가질 수 있음
- 노드의 추가 삭제에 시간이 걸림(반복 비교로 자리를 찾아 지정) 👉🏻 HashSet보다 데이터 추가, 삭제에 시간이 더 걸림
- 검색(범위 검색)과 정렬에 유리 👉🏻 배열이나 링크드 리스트에 비해 검색과 정렬 기능이 뛰어남
- 중복값 저장 불가
- 첫 번째 저장 값은 루트, 두 번째 값은 루트와 값을 비교하여 저장 , 그 이후 값은 루트부터 값의 크기를 비교하여 저장
2) TreeSet의 메서드
TreeSet set = new TreeSet();
int[] score = {80, 95, 50, 35, 45, 65, 10, 100};
for(int i=0; i < score.length; i++)
set.add(new Integer(score[i]));
// headSet(): 요소보다 큰 값 반환, tailSet(): 요소보다 작은 값 반환
System.out.println("50보다 작은 값 :" + set.headSet(new Integer(50)));
System.out.println("50보다 큰 값 :" + set.tailSet(new Integer(50)));
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/TreeSet.html
'Java' 카테고리의 다른 글
Java Collections 클래스 (0) | 2023.01.09 |
---|---|
Java HashMap, Hashtable (0) | 2023.01.07 |
Java Comparable, Comparator 인터페이스 (0) | 2023.01.03 |
Java Arrays 클래스(Arrays Class) (0) | 2023.01.03 |
Java Iterator, ListIterator, Enumeration 인터페이스 (0) | 2023.01.03 |