안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
검색 기능을 강화시킨 컬렉션에 대해 공북하겠습니다.
1. 이진트리구조
: 여러 개의 노드로 연결된 트리 형태로 연결된 구조이다.
루트 노드라 불리는 하나의 노드에서부터 시작해 최대 2개의 노드를
연결할 수 있는 구조
상 하로 연결된 두 노드를 부모 <-> 자식 관곙 있다고 하면
위를 부모, 아래를 자식이라 합니다.
부모 노드 값보다 작은 값은 왼쪾 자식 노드에, 크면 오른쪾 자식 노드에 위치시킵니다.
ex) 첫번 째로 저장되는 값이 루트 노드가 되고, 두번 째 값은 루트 노드부터
시작해서 값의 크기를 비교하며 트리를 따라 내려갑니다.
숫자가 아닌 문자를 저장할 시 문자의 유니코드 값으로 크기를 비교합니다.
이런 식으로 트리를 구성하면 마지막 왼쪽 노드는 가장 작은 값이,
마지막 오른쪽 노드는 가장 큰 값이 됩니다.
2. TreeSet
==> 이진 트리를 기반으로 한 Set 컬렉션
하나의 노드는 노드 값인 Value 와 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의
변수로 구성됩니다.
TreeSet에 객체를 저장하면 자동으로 정렬이 됩니다.
부모 값과 비교해 낮은 것은 왼쪽 자식 노드에, 큰 것은 오른쪽 자식 노드에 저장됩니다.
TreeSet을 생성하려면 저장할 객체의 타입을 파라미터로 표기하고
기본 생성자를 호출하면 됩니다.
TreeSet<E> set = new TreeSet<E>();
Set 인터페이스 타입 변수에 대입해도 되지만 TreeSet 클래스 타입으로 대입한 이유는?
객체를 찾거나 범위 검색과 관련된 메소드들을 사용하기 위함입니다.
예제)
import java.util.TreeSet;
public class Example {
public static void main(String[] args) {
TreeSet<Integer> scores = new TreeSet<Integer>();
scores.add(new Integer(77));
scores.add(new Integer(88));
scores.add(new Integer(65));
scores.add(new Integer(85));
scores.add(new Integer(70));
Integer score = null;
score = scores.first();
System.out.println("가장 낮은 점수: " + score);
score = scores.last();
System.out.println("가장 높은 점수: " + score + "\n");
score = scores.lower(new Integer(95));
System.out.println("85점 아래 점수: " + score);
score = scores.higher(new Integer(95));
System.out.println("85점 위의 점수: " + score + "\n");
score = scores.floor(new Integer(95));
System.out.println("85점 이거나 바로 아래 점수: " + score);
score = scores.ceiling(new Integer(85));
System.out.println("75점 이거나 바로 위의 점수: " + score + "\n");
while(!scores.isEmpty()) {
score = scores.pollFirst();
System.out.println(score + "(남은 객체 수: " + scores.size() + ")");
}
}
}
아래 표는 TreeSet이 가진 정렬관련 메소드들 입니다.
NavigableSet은 TreeSet처럼 first(), last(), lower(), higher(), floor(), ceiling()를 제공하고,
정렬 순서를 바꾸는 descendingSet() 메서드도 제공합니다.
오름차순으로 정렬하고 싶을 때에는 아래처럼 descendingSet()을 두 번 호출하면 됩니다.
NavigableSet<E> descendingSet = treeSet.descendingSet();
NavigableSet<E> ascendingSet = descendingSet.descendingSet();
import java.util.NavigableSet;
import java.util.TreeSet;
public class Example {
public static void main(String[] args) {
TreeSet<Integer> scores = new TreeSet<Integer>();
scores.add(new Integer(77));
scores.add(new Integer(88));
scores.add(new Integer(65));
scores.add(new Integer(85));
scores.add(new Integer(70));
NavigableSet<Integer> descendingSet = scores.descendingSet();
for(Integer score : descendingSet) {
System.out.print(score + " ");
}
System.out.println();
NavigableSet<Integer> ascendingSet = descendingSet.descendingSet();
for(Integer score : ascendingSet) {
System.out.print(score + " ");
}
}
}
TreeSet이 가지는 범위 관련 검색 메소드들
예제)
import java.util.NavigableSet;
import java.util.TreeSet;
public class Example {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("apple");
treeSet.add("forever");
treeSet.add("description");
treeSet.add("ever");
treeSet.add("zoo");
treeSet.add("base");
treeSet.add("guess");
treeSet.add("cherry");
System.out.println("[c~f 사이의 단어 검색]");
NavigableSet<String> rangeSet = treeSet.subSet("c", true, "f", true);
for(String word : rangeSet) {
System.out.println(word);
}
}
}