top bar

글 목록

2015년 9월 2일 수요일

[JAVA] Set

개요



Set은 각 객체 값에 대해 하나의 인스턴스만 저장한다. 즉, 동일한 객체의 인스턴스를 추가하려고 하면 중복을 막는다. Set의 가장 일반적인 용도는 특정 객체의 존재 유무를 확인하는 것이고 때문에 contain 메소드를 사용한 '검색'이 Set에서 가장 중요한 기능이다. 일반적으로 해싱함수를 사용한 HashSet이 가장 많이 쓰인다.


예제



아래는 Integer 객체를 저장하는 HashSet 사용 예이다.
Random rand = new Random(47);

Set<Integer> intset = new HashSet<Integer>();
for (int i = 0; i < 10000; i++) {
    intset.add(rand.nextInt(30));
}
System.out.println(intset);
> 결과
[0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 12, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28]
0부터 29 사이의 값에 대해서 10000개의 무작위 수가 Set에 추가되었지만 위에서 보는바와 같이 중복을 허용하지 않고 있다.

만약 정렬된 결과를 얻고 싶다면 TreeSet을 사용한다.
SortedSet<Integer> intset = new TreeSet<Integer>();

for (int i = 0; i < 10000; i++) {
    intset.add(rand.nextInt(30));
}
System.out.println(intset);
> 결과
[0, 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]
TreeSet의 요소들은 red-black tree(2진 정렬 트리)의 구조로 데이터 정렬을 유지하여 위와같은 결과가 나온다

LinkedHashSet도 정렬을 유지한다. 하지만 정렬의 기준은 '추가된 순서' 이다. 아래와 같다.
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<Integer>();
        
linkedHashSet.add(1);
linkedHashSet.add(10);
linkedHashSet.add(5);
linkedHashSet.add(3);
linkedHashSet.add(7);
        
System.out.println(linkedHashSet);  
> 결과
[1, 10, 5, 3, 7]


댓글 없음:

댓글 쓰기