TreeSet 자료형은 이진트리 (Binary Tree) 구조의 자료형태이다. 최상위층을 중심으로 값이 적고 많은 노드로 나눠진다. 구조의 몇가지 규칙이 있으나 사용자가 알아야 할 것은 데이터의 추가나 삭제에 시간이 걸리고, 상대적으로 검색 능력이 좋다는 것이다.

 

이 포스트에서는 예제를 빠르게 보고 지나간다.

 

더 자세하게 알고 싶고 직접 자료구조를 구현하려는 사람은 C알고리즘의 이진트리를 공부하는 것을 추천한다. 자바 콜렉션 프레임워크는 직접 자료형을 구현하는게 아니라 객체지향에 맞춰 사용하는 것에 초점이 맞춰져 있다.

 

en.wikipedia.org/wiki/Binary_tree

 

Binary tree - Wikipedia

Not to be confused with B-tree. A labeled binary tree of size 9 and height 3, with a root node whose value is 2. The above tree is unbalanced and not sorted. In computer science, a binary tree is a tree data structure in which each node has at most two chi

en.wikipedia.org

 

* 이쯤되면 콜렉션 프레임 워크의 사용법이 비슷비슷하다는 생각이 들것이다.

 

트리 셋이라는 것은 Set 인터페이스를 받았기 때문에 중복을 허용하지 않는다. 로또 번호의 경우 이 조건에 들어 맞는다.

 

set.size() < 6 으로 루프를 돌면 중복이 나오면 버리고 순수한 6개 숫자가 찰때까지 루프한다. 아래 코드로 돌리면 간혹 한두번 정도 더 루프를 돈다. 범위가 줄어들면 같은 번호 중복일 가능성이 높아진다. 그러면 루프 횟수가 증가한다.

 

        Set set = new TreeSet();

        for (int i = 0; set.size() < 6; i++) {
            int num = (int)(Math.random()*45)+1;
            set.add(num);
        }
        System.out.println(set);

로또 번호 생성 코드

사실 소프트웨어의 난수는 알고리즘에 의해 만들어지는 것이라서 완전하지가 않다. 로또가 순수한 자연의 정규분포에서 선택되는 것이라면 컴퓨터로 난수를 생성하는 것은 그다지 좋은 선택이 아닐지도 모른다. 그냥 머리속에 갑자기 떠오르는 숫자가 더 좋을지도 모른다... 만 요새는 자동으로도 당첨이 된다니까 로또는 그냥 도박의 일종이라 생각한다;;;

그런 상상이라도 해야 살만한 세상이다

 

-> 완전한 랜덤이 아니지만 그럴듯하게 보이는 랜덤함수를 수도 랜덤(의사 난수) 라고 한다.

 

 

* 다음 예제는 범위의 문자열을 찾는 메소드다.

 

start 지점부터 end 지점까지 해당하는 subSet 하위집합을 찾는다.

 

우선 랜덤 함수로 무작위 문자열을 생성한다. random.nextInt(5) + 5 는 5에서부터 9까지 범위의 정수를 무작위로 만든다. 문자열의 길이이다.

 

a 부터 f 까지 문자로 시작하는 문자열을 찾는다. (subSet 메소드)

 

기본적으로 트리셋은 중복이 되지 않고 데이터의 입력시점에 정렬이 되는 모습을 볼 수 있다.

        TreeSet set1 = new TreeSet();

        String start = "a";
        String end = "f";

        Random random = new Random();

        for (int i = 0; i < 10; i++) {
           int length = random.nextInt(5)+5;
            set1.add(randomWord("lower", length));
        }
        System.out.println(set1);
        System.out.println("set1.subSet(start,end) = " + set1.subSet(start, end));

 

 

* 마지막 예제는 배열을 트리셋에 넣고 기준점을 잡아서 그보다 작은 숫자와 큰 숫자로 나누는 방법이다.

 

TreeSet에 배열을 무작위로 입력하면 바로 정렬이 된다. 정렬하지 않아도 오른쪽(큰수) 왼쪽(작은수)이 나눠진다.

 

        TreeSet set2 = new TreeSet();
        int[] array = {25, 35, 15, 90, 70, 65, 80, 50, 100};

        for(int i=0; i < array.length; i++)
            set2.add(array[i]);

        System.out.println("set2.headSet(70) = " + set2.headSet(70));
        System.out.println("set2.headSet(70) = " + set2.tailSet(70));

 

TreeSet 은 이진 트리의 Tree 속성과 집합의 Set 속성을 함께 가지고 있는 콜렉션이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band