Notice
Recent Posts
Recent Comments
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

TreeSet의 주요 생성자와 메서드 본문

Java/JAVA2

TreeSet의 주요 생성자와 메서드

빌드이너프 2023. 7. 23. 11:08

TreeSet의 주요 생성자와 메서드

생성자 또는 메서드 설명
TreeSet() 기본 생성자
TreeSet(Collcetion c) 주어진 컬렉션을 저장하는 TreeSet을 생성
TreeSet(Comparator comp) 주어진 정렬기준으로 정렬하는 TreeSet을 생성
Object first() 정렬된 순서에서 첫 번째 객체를 반환한다
Object last() 정렬된 순서에서 마지막 객체를 반환한다
Object ceiling(Object o) 지정된 객체와 같은 객체를 반환, 없으면 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null
Object floor(Object o) 지정된 객체와 같은 객체를 반환, 없으면 작은 값을 가진 객체 중 제일 가까운 값을 객체를 반환, 없으면 null
Object higher(Object o) 지정된 객체보다 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null
Object lower(Object o) 지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null
SortedSet subSet(Object fromElement, Object toElement) 범위 검색(fromElement와 toElement 사이)의 결과를 반환한다
(끝 범위인 toElement는 범위에 포함되지 않음)
SortedSet headSet(Object toElement) 지정된 객체보다 작은 값의 객체들을 반환한다
SortedSet tailSet(Object fromElement) 지정된 객체보다 큰 값의 객체들을 반환한다

 

코드

TreeSet이기 때문에 정렬되어 출력된다

import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        Set set = new TreeSet();

        for (int i = 0; set.size() < 6 ; i++) {
            int num = (int)(Math.random()*45) + 1;
            set.add(num);  // set.add(new Integer(num));
        }

        System.out.println(set);
    }
}

[20, 29, 32, 34, 36, 42]

 

HashSet일 경우 정렬되지 않는다

import java.util.HashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set set = new HashSet();

        for (int i = 0; set.size() < 6 ; i++) {
            int num = (int)(Math.random()*45) + 1;
            set.add(num);  // set.add(new Integer(num));
        }

        System.out.println(set);
    }
}

[6, 22, 38, 9, 43, 15]

 

HashSet을 정렬할 경우 list로 변환 후 정렬한다

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.Collections;

public class HashSetTest2 {
    public static void main(String[] args) {
        Set set = new HashSet();
        
        // set의 크기가 6보다 작은 동안 1~45 사이의 난수를 저장
        for (int i = 0; set.size() < 6 ; i++) {
            int num = (int)(Math.random()*45) + 1;
            // set.add(new Integer(num));
            set.add(num);
        }
        
        // set은 정렬불가능하기 때문에 set을 list로 옮겨서 정렬한다
        List list = new LinkedList(set); // LinkedList(Collection c)
        Collections.sort(list);          // Collections.sort(List list)
        System.out.println(list);
    }
}

[8, 9, 11, 12, 14, 18]

에러 발생(비교 기준이 없기 때문)

set의 add 메서드는 비교하면서 저장한다, 하지만 비교 기준이 없기 때문에 에러가 발생한다

import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        Set set = new TreeSet();

        for (int i = 0; set.size() < 6 ; i++) {
            int num = (int)(Math.random()*45) + 1;
            set.add(new Test());  // set.add(new Integer(num));
        }

        System.out.println(set);
    }
}

class Test {} // 비교 기준 없음

 

이럴땐 비교기준을 만들어주면 된다

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        Set set = new TreeSet(new TestComp()); // 새로만든 비교 기준 TestComp()를 넣어줘야 한다

        // for문이 계속 돌기 때문에 주석 처리
//        for (int i = 0; set.size() < 6 ; i++) {
//            int num = (int)(Math.random()*45) + 1;
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
//        }

        System.out.println(set);
    }
}

class Test {}

class TestComp implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return -1; // return 0 이면 같은 객체로 판단하기 때문에 값이 하나로 나옴, 1또는 -1로 해야됨
    }
}

[Test@5594a1b5, Test@6a5fc7f7, Test@3b6eb2ec, Test@1e643faf, Test@6e8dacdf]

 

Test 클래스가 Comparable 구현한다면 Comparator을 안넣어도 된다

new TestComp()지워도 된다

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        Set set = new TreeSet(); // 새로만든 비교 기준 TestComp()를 넣어줘야 한다

        // for문이 계속 돌기 때문에 주석 처리
//        for (int i = 0; set.size() < 6 ; i++) {
//            int num = (int)(Math.random()*45) + 1;
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
            set.add(new Test());  // set.add(new Integer(num));
//        }

        System.out.println(set);
    }
}

class Test implements Comparable{
    @Override
    public int compareTo(Object o) {
        return -1;
    }
}

class TestComp implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return -1; // return 0 이면 같은 객체로 판단하기 때문에 값이 하나로 나옴, 1또는 -1로 해야됨
    }
}

[Test@3ac3fd8b, Test@5594a1b5, Test@6a5fc7f7, Test@3b6eb2ec, Test@1e643faf]

 

즉, TreeSet은 비교기준이 필요하기 때문에 저장하는 객체가 Comparable을 가지고 있든지[set.add(new Test())], TreeSet이 어떤 비교 기준[new TestComp()]을 갖도록 해야한다

 


코드

b~d사이의 단어 출력

import java.util.*;

public class TreeSetTest2 {
    public static void main(String[] args) {
        TreeSet set = new TreeSet(); // 범위 검색에 유리(from~to)

        String from = "b";
        String to	= "d";

        set.add("abc");      set.add("alien");    set.add("bat");
        set.add("car");      set.add("Car");      set.add("disc");
        set.add("dance");    set.add("dZZZZ");    set.add("dzzzz");
        set.add("elephant"); set.add("elevator"); set.add("fan");
        set.add("flower");

        System.out.println(set);
        System.out.println("range search : from " + from  +" to "+ to);
        System.out.println("result1 : " + set.subSet(from, to)); // b, d
        System.out.println("result2 : " + set.subSet(from, to + "zzz"));
    }
}

[Car, abc, alien, bat, car, dZZZZ, dance, disc, dzzzz, elephant, elevator, fan, flower]
range search : from b to d
result1 : [bat, car]
result2 : [bat, car, dZZZZ, dance, disc]

코드

import java.util.TreeSet;

public class TreeSetTest3 {
    public static void main(String[] args) {
        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]));

        System.out.println("50보다 작은 값: " + set.headSet(new Integer(50)));
        System.out.println("50보다 큰 값: "  + set.tailSet(new Integer(50)));
        System.out.println("40에서 80사이에 있는 값: "  + set.subSet(40, 80));
    }
}

50보다 작은 값: [10, 35, 45]
50보다 큰 값: [50, 65, 80, 95, 100]
40에서 80사이에 있는 값: [45, 50, 65]

 

TreeSet 범위 검색 subSet(), headSet(), tailSet()

메서드 설명
SortedSet subSet(Object fromElement, Object toElement) 범위 검색(fromElement와 toElement 사이)의 결과를 반환한다
(끝 범위인 toElement는 범위에 포함되지 않음)
SortedSet headSet(Object toElement) 지정된 객체보다 작은 값의 객체들을 반환한다
SortedSet tailSet(Object fromElement) 지정된 객체보다 큰 값의 객체들을 반환한다

 

'Java > JAVA2' 카테고리의 다른 글

HashMap  (0) 2023.07.23
TreeSet  (0) 2023.07.19
HashSet 2  (0) 2023.07.17
HashSet 1  (0) 2023.07.16
Arrays  (0) 2023.07.14