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 |