가자미의 개발이야기

자바 컬렉션 프레임워크 Set<E> : HashSet, TreeSet 본문

Java/자바 기본 문법

자바 컬렉션 프레임워크 Set<E> : HashSet, TreeSet

가자미 2021. 2. 2. 15:15

a. Set<E>

중복 안되고 순서가 없는 집합 개념
메소드는 Collection 메소드와 동일

 

b. HashSet

순서 상관x, 중복 허용 안됨

중복요소 제거하고 싶으면 HashSet

순서를 유지하고 싶으면 LinkedHashSet

 

#생성자

HashSet() 해쉬셋 객체생성
HashSet(Collection c) 주어진 컬렉션을 포함하는 해쉬셋 객체생성
HashSet(int initialCapacity) 초기 용량을 가진 해쉬셋을 생성
HashSet(int initialCapacity, float loadFactor) 초기 용량과 load factor를 지정하는 생성자

메소드는 Collection 메소드와 거의 동일

 

--Set<E>를 구현하는 HashSet<E>클래스의 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
 
public class SetPractice {
    public static void main(String[] args) {
        Set<String> set=new HashSet<>();
        set.add("Toy"); set.add("Box");
        set.add("Robot");
        System.out.println("인스턴스 수 :"+set.size());
        
        //반복자를 이용한 전체 출력
        for(Iterator<String> itr=set.iterator();itr.hasNext();) {
            System.out.print(itr.next()+'\t');
        }
        System.out.println();
        
        //for-each문을 이용한 전체 출력
        for(String s : set) {
            System.out.print(s+'\t');
        }
        System.out.println();
    }
}
 

HashSet으로 중복된 요소 제거하기

import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class Num {
    public static void main(String[] args) {
        List<String> lst = Arrays.asList("BOX", "TOY","BOX","TOY");
        ArrayList<String> list=new ArrayList<>(lst);
        
        for(String s: list) {
            System.out.print(s.toString()+'\t');
        }
        System.out.println();
        
        //중복된 인스턴스 제거
        HashSet<String> set = new HashSet<>(list);
        //원래대로 ArrayList인스턴스로 저장물을 옮긴다.
        list= new ArrayList<>(set);
        
        for (String s :list) {
            System.out.print(s+'\t');
        }
    }
}

해쉬에서 동일 인스턴스의 기준은?

--public int hashCode(); 이 메소드는 해쉬의 분류 기준을 확정하고 분류결과가 일치하고

--equals메소드의 결과가 true이면 동일 인스턴스로 취급!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Num {
    private int num;
    public Num(int n) {num=n;}
    
    @Override
    public String toString() {return String.valueOf(num);}
    
    @Override
    public int hashCode() {
        return num %3;//num의 갑싱 같으면 부류도 같다.
    }
    
    @Override
    public boolean equals(Object obj) {
        if(num==((Num)obj).num)
            return true;
        else
            return false;
    }
}
 

-해쉬 알고리즘 일일히 정의하기 싫다면...

--public static int hash(object,..., values) ->java.util.Objects에 정의된 메소드. 전달된 인자 기반 해쉬값 반환

--오버라이딩해서 사용

 

c. TreeSet<E>

이진 검색 트리 형태로 데이터 저장.

-트리 기반으로 인스턴스 저장. 정렬상태가 유지되면서 인스턴스 저장됨

#생성자

TreeSet() 기본 생성자
TreeSet(Collection c) 주어진 컬렉션을 저장하는 트리셋 생성
TreeSet(Comparator comp) 주어진 정렬 조건으로 정렬하는 트리셋 생성
TreeSet(SortedSet s) SortedsSet를 구현한 커렉션 s를 저장하는 TreeSet 생성

#메서드 Collection 메소드는 비슷

메서드 내용
Object ceiling(Object o) 지정한 객체와 같은 객체가 있으면 반환, 없으면 큰 값을 가진 객체 중에 제일 가까운 값에 객체를 반환. 없으면 null
Comparator comparator() 트리셋의 정렬기준을 반환
Object first() 첫 객체를 반환
Object floor(Object o) 지정한 객체와 같은 객체가 있으면 반환, 없으면 작은 값을 가진 객체 중에 제일 가까운 값에 객체를 반환. 없으면 null
SortedSet headSet(Object toElement) 지정된 객체보다 작은 값의 객체들을 반환
SortedSet tailSet(Object fromElement) 지정된 객체보다 큰 값의 객체들을 반환
SortedSet subSet(Object from, Object to) from 객체부터 to 전 객체까지 반환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.TreeSet;
import java.util.Set;
import java.util.Iterator;
public class Num {
    public static void main(String[] args) {
        TreeSet<Integer> tree = new TreeSet<Integer>();
        tree.add(3); tree.add(1); tree.add(2); tree.add(4);
        System.out.println("인스턴스 수: "+ tree.size());
    
        for(Integer n : tree) {
            System.out.print(n.toString()+'\t');
        }
        System.out.println();
        
        for(Iterator<Integer> itr=tree.iterator();itr.hasNext();)
            System.out.print(itr.next().toString()+'\t');
        System.out.println();
    }
}
 

TreeSet<E> 클래스의 오름차순 출력?

-interface Comparable<T>의 int compareTo(T o)의 구현.

public interface Comparator<T>의 int compare(T o1, T o2)의 구현 *이 방법은 어떤 클래스의 compareTo메소드 구현이 마음에 안들고 새로운 방식으로 정렬하고 싶을 때 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Comparator;
import java.util.TreeSet;
 
class PersonComparator implements Comparator<Person>{
    public int compare(Person p1, Person p2) {
        return p2.age-p1.age;
    }
}
 
public class Person implements Comparable<Person>{
    String name;
    int age;
    public Person(String nme, int ag) {
        this.age=ag; this.name=nme;
    }
    @Override
    public int compareTo(Person p) {
        return this.age-p.age;
    }
    @Override
    public String toString() {
        return this.name+this.age;
    }
    
    public static void main(String[] args) {
        TreeSet<Person> tree = new TreeSet<>(new PersonComparator());
        tree.add(new Person("Yoon"37));
        tree.add(new Person("Hong"53));
        tree.add(new Person("Park"22));
        
        for(Person p : tree) {
            System.out.println(p);
        }
    }
}