본문 바로가기

Java

Java 컬렉션(Collection) - Set(집합) HashSet, TreeSet

 

복습!
- 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

 

TreeSet (Java SE 11 & JDK 11 )

 

docs.oracle.com

 

'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