본문 바로가기

라이브러리 활용 - 컬렉션 자료구조

검색 기능을 강화시킨 컬렉션

TreeSet

  • 이진 트리를 기반으로 한 Set 컬렉션
  • 여러 개의 노드가 트리 형태로 연결된 구조. 루트 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할 수 있음


    출처, 이것이 자바다


  • TreeSet에 객체를 저장하면 부모 노드의 객체와 비교해서 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장


    출처, 이것이 자바다


TreeSet 컬렉션을 생성하는 방법


출처, 이것이 자바다


* Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메소드가 TreeSet에만 정의되어 있기 때문


출처, 이것이 자바다


package ch15.sec05.exam01;

import java.util.NavigableSet;
import java.util.TreeSet;

/*
 검색기능을 강화시킨 컬렉션
 TreeSet 클래스 
 */

public class TreeSetExample {

    public static void main(String[] args) {

        TreeSet<Integer> scores = new TreeSet<>();

        //객체저장. 비교하면서 데이터가 정렬되어 관리된다.
        scores.add(87);
        scores.add(98);
        scores.add(75);
        scores.add(95);
        scores.add(80);

        //오름차순 정렬
        for(Integer s : scores) {
            System.out.print(s + " ");
        }
        System.out.println("\n");

        //특정 Integer 객체를 가져오기
        System.out.println("가장 낮은 점수: " + scores.first());
        System.out.println("가장 높은 점수: " + scores.last());
        System.out.println("95점 아래 점수: " + scores.lower(95));
        System.out.println("95점 위의 점수: " + scores.higher(95));
        System.out.println("95점이거나 바로 아래 점수: " + scores.floor(95));
        System.out.println("85점이거나 바로 위의 점수: " + scores.ceiling(85) + "\n");

        //내림차순으로 정렬하기
        NavigableSet<Integer> descendingScores = scores.descendingSet();
        for(Integer s : descendingScores) {
            System.out.print(s + " ");
        }
        System.out.println();

        for(Integer s : scores) {
            System.out.print(s + " ");
        }
        System.out.println("\n");

        //범위 검색 ( 80 <= )
        NavigableSet<Integer> rangeSet = scores.tailSet(80, true);
        for(Integer s : rangeSet) {
            System.out.print(s + " ");
        }
        System.out.println();

        //범위 검색 ( 80 <= scores <90 )
        rangeSet = scores.subSet(80, true, 90, false);
        for(Integer s : rangeSet) {
            System.out.print(s + " ");
        }
    }
}

TreeMap

  • 이진 트리를 기반으로 한 Map 컬렉션. 키와 값이 저장된 엔트리 저장
  • 부모 키 값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 Entry 객체를 저장


    출처, 이것이 자바다


  • TreeSet 컬렉션을 생성하는 방법


    출처, 이것이 자바다



    출처, 이것이 자바다


Comparable과 Comparator

  • TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체를 정렬
  • Comparable 인터페이스에는 compareTo() 메소드가 정의. 사용자 정의 클래스에서 이 메소드를 재정의해서 비교 결과를 정수 값으로 리턴


    출처, 이것이 자바다


package ch15.sec05.exam03;

public class Person implements Comparable<Person> {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //정렬시 사용하는 메소드를 재정의.
    //추가되는 객체의 값을 대소비교 작업(기준 나이 : age)
    @Override
    public int compareTo(Person o) {

        System.out.println("compareTo() 호출");


        //조건에 따라 기준을 정한다. 나이조건.
        if(age < o.age) return -1;
        else if(age == o.age) return 0;
        else return 1;

    }    
}

package ch15.sec05.exam03;

import java.util.TreeSet;

public class ComparableExample {

    public static void main(String[] args) {

        TreeSet<Person> treeSet = new TreeSet<Person>();

        //객체저장
        treeSet.add(new Person("홍길동", 45));
        treeSet.add(new Person("감자바", 25)); // 25, 45
        treeSet.add(new Person("이순신", 31)); // 25 < 31 비교후 45 < 25 비교를 하기때문에 4번 실행이됨
    }
}

  • 비교 기능이 없는 Comparable 비구현 객체를 저장하려면 비교자 Comparator를 제공


    출처, 이것이 자바다


  • 비교자는 compare() 메소드를 재정의해서 비교 결과를 정수 값으로 리턴


    출처, 이것이 자바다


package ch15.sec05.exam04;

public class Fruit {
    public String name;
    public int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }        
}

package ch15.sec05.exam04;

import java.util.Comparator;

public class FruitComparator implements Comparator<Fruit> {

    //정렬을 위한 대소비교작업을 구현해야 한다.
    @Override
    public int compare(Fruit o1, Fruit o2) {
        if(o1.price < o2.price) return -1;
        else if(o1.price == o2.price) return 0;
        else return 1;
    }
}

package ch15.sec05.exam04;

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

public class ComparatorExample {

    public static void main(String[] args) {

        TreeSet<Fruit> treeSet = new TreeSet<Fruit>(new FruitComparator());

        //객체저장
        treeSet.add(new Fruit("포도", 3000));
        treeSet.add(new Fruit("수박", 10000));
        treeSet.add(new Fruit("딸기", 6000));

        for(Fruit fruit : treeSet) {
            System.out.println(fruit.name + " : " + fruit.price);
        }
    }
}

'라이브러리 활용 - 컬렉션 자료구조' 카테고리의 다른 글

LIFO와 FIFO 컬렉션  (0) 2023.02.01
Map 컬렉션  (0) 2023.02.01
Set 컬렉션  (0) 2023.02.01
List 컬렉션  (0) 2023.02.01
컬렉션 프레임워크  (0) 2023.01.31